2016-01-21 103 views
1

事務回滾從MySQL docs,我得到以下(錯誤碼):聲明回滾VS在MySQL

  • 1205(ER_LOCK_WAIT_TIMEOUT)

    鎖等待超時。等待時間過長的陳述是回滾(不是整個交易) 。您可以增加innodb_lock_wait_timeout配置選項的值 如果SQL語句 應該等待更長的時間用於其他交易來完成,或者減少其 如果過多長時間運行的事務造成鎖定問題和 減少繁忙的系統上併發。

在這份聲明中,這顯然會讓聲明回滾和事務回滾之間的差異。我的問題是如何回滾一個語句,其中運行的事務不會回滾?更重要的是,我在事務中獲得了這樣的鎖定超時,並且完整事務被回滾。有人能爲此啓發我嗎?

回答

2

與事務類似,語句也是原子的。一旦語句開始執行數據更改,將保存原始狀態(實際上記錄更改)。如果語句出於任何原因失敗(超時,與剛剛提交的事務發生衝突),則更改必須恢復爲原始狀態。該聲明將報告失敗,但交易仍處於開放狀態,您可以繼續交易,就像聲明從未執行一樣。

這實際上與保存點類似 - 您可以想象,在每個語句保存點被記錄之前,語句完成後,保存點將被提交。然而,這對外部交易或保存點沒有影響。

+0

爲什麼我的事務回滾? – artaxerxe

+0

你認爲這是由於我在MySQL上使用了ORM嗎? – artaxerxe

+1

是的,最有可能的。如果失敗,ORM通常會回滾完整事務。 –