2015-06-19 31 views
3

如果用戶在事務中間停止完全加載頁面,然後刷新頁面,事務是否會應用兩次?在事務處理中重新加載頁面

+2

不完全確定,但我想它取決於在刷新發生之前是否命中了'COMMIT'命令。 – diggersworld

+0

交易正在服務器上進行,並且很容易測試。客戶端刷新會發送一個新的,即使重複的請求。 –

+0

一旦用戶發送請求,它就會被髮送。通常沒有辦法知道用戶是否在他們的瀏覽器中點擊「停止」。很多人會在帖子表單中使用唯一值來阻止它發生兩次,或者Post/Redirect/Get工作流程停止頁面刷新成爲一個大問題。 – TZHX

回答

5

簡短的答案是 - 你必須檢查。如果即使一個查詢沒有正確執行,事務也會失敗。但是,這是真正的問題 - 如果用戶中止加載,那並不意味着服務器將停止執行代碼。中止頁面加載意味着用戶決定不再接收數據。您的Web服務器不必遵守,也不必遵守PHP - 他們可能甚至不知道用戶關閉管道的事實。現在我們進入一個完全不同的遊戲區域 - PHP可以嵌入到服務器中,也可以作爲獨立服務器(稱爲php-fpm)。如果PHP通過mod_php嵌入到Apache等服務器中 - Apache將決定是否會中斷正在執行PHP進程的線程或進程。它仍然可以決定執行整個事情,收集結果,然後它會嘗試將結果寫回到套接字 - 只是意識到用戶不在那裏了。

正如你所看到的,你的問題的複雜性不是那麼簡單,「如果用戶中止」 - 它不是由用戶到你的Web服務器上程序運行過程

現在,讓我們假設Web服務器願意玩球,它會以某種方式告訴PHP中止執行 - 在這種情況下,事務將不會執行,它將失敗,因爲不會發出提交。

如果服務器不願意玩球,或者根本沒有辦法中止PHP進程 - 那麼是的,最終會執行兩個或更多的事務,具體取決於您的用戶所做的事情。