2017-03-20 161 views
4

我以爲我會問,因爲我不確定這個操作的結果沒有在原始性質上處理很多事務。交易和異常

當在PHP中拋出異常停止執行時,如何處理數據庫事務。它是否會自動回滾,因爲連接到數據庫的連接從PHP中刪除或鎖定是否保持原位?

僞碼

TX Begin 
Select Balance 
Logic in PHP 
    Exception 
    Rollback 
Commit 

注:我知道最好的編碼習慣使然,我在catch回滾。這只是我想知道的一個行爲問題。

+0

數據庫連接不會被刪除,除非您明確關閉它或腳本停止運行。 – Shadow

+2

自動回滾取決於db/connection ....的配置,不要依賴它,它可以設置爲自動提交....如果使用事務,則使用顯式回滾/提交(也有助於代碼可讀性,因爲那樣你不需要檢查代碼的外部任何東西) –

+0

@Shadow在我的例子中,異常會終止執行。 – Ray

回答

1

要確定在連接(會話)終止時MySQL如何處理事務,我們必須考慮是否啓用autocommit模式。

  1. 如果自動提交被禁用,並且提交之前,連接被終止,那麼最後打開transaction is rolled back

如果已自動提交禁用兩端沒有明確承諾最終交易,MySQL的滾動會話回到那個交易。

注意,start transaction隱含disable autocommit做爲交易的持續時間:

隨着START TRANSACTION,直到結束與提交或回滾事務自動提交保持禁用。自動提交模式然後恢復到之前的狀態。

  • 如果自動提交被啓用,那麼任何成功數據修改無論如何提交。如果數據修改語句導致錯誤,那麼顯然這些更改不會被提交(在這種情況下沒有變化)。所以,在這種情況下終止連接並沒有什麼不同。
  • 但是,正如@MarkBaker也指出的那樣,如果檢測到錯誤以清楚地向代碼的所有讀者明確指出,那麼顯式回退事務可能是一個好主意。請記住,你自己並不清楚它的工作方式,而其他的PHP程序員如果在代碼中看不到明確的回滾,可能會有相同的問題。