MySQL 8.4 發行說明
以下項目描述 InnoDB
如何執行錯誤處理。InnoDB
有時只會回滾失敗的陳述式,其他時候則會回滾整個交易。
如果您的表空間中檔案空間不足,則會發生 MySQL
Table is full
錯誤,而InnoDB
會回滾 SQL 陳述式。交易死結會導致
InnoDB
回滾整個交易。發生這種情況時,請重試整個交易。鎖定等待逾時會導致
InnoDB
回滾目前的陳述式(正在等待鎖定並遇到逾時的陳述式)。若要回滾整個交易,請在啟動伺服器時啟用--innodb-rollback-on-timeout
。如果使用預設行為,則重試陳述式;如果啟用--innodb-rollback-on-timeout
,則重試整個交易。在繁忙的伺服器上,死結和鎖定等待逾時都很常見,應用程式必須知道可能會發生這種情況,並透過重試來處理它們。您可以盡可能在交易期間首次變更資料和提交之間執行最少的工作,使鎖定保持在最短的時間內,並鎖定最少量的列,以降低它們發生的可能性。有時在不同的交易之間拆分工作可能實用且有幫助。
如果您未在陳述式中指定
IGNORE
選項,則重複鍵錯誤會回滾 SQL 陳述式。列過長錯誤
會回滾 SQL 陳述式。其他錯誤大多由 MySQL 程式碼層(高於
InnoDB
儲存引擎層級)偵測到,並回滾對應的 SQL 陳述式。在回滾單一 SQL 陳述式時,不會釋放鎖定。
在隱式回滾期間,以及執行顯式的 ROLLBACK
SQL 語句時,SHOW PROCESSLIST
會在相關連線的 State
欄位中顯示 Rolling back
。