文件首頁
MySQL 8.4 參考手冊
相關文件 下載本手冊
PDF (美國信紙) - 39.9Mb
PDF (A4) - 40.0Mb
Man Pages (TGZ) - 258.5Kb
Man Pages (Zip) - 365.5Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


17.7.5.2 死鎖偵測

當啟用死鎖偵測(預設)時,InnoDB 會自動偵測交易死鎖,並回滾一個或多個交易以打破死鎖。InnoDB 嘗試選擇小型交易進行回滾,其中交易的大小由插入、更新或刪除的列數決定。

如果 innodb_table_locks = 1(預設值)且 autocommit = 0,且其上方的 MySQL 層知道列級鎖定,則 InnoDB 會知道資料表鎖定。否則,InnoDB 無法偵測到涉及 MySQL LOCK TABLES 陳述式設定的資料表鎖定,或涉及 InnoDB 以外的儲存引擎設定的鎖定的死鎖。透過設定 innodb_lock_wait_timeout 系統變數的值來解決這些情況。

如果 InnoDB 監視器輸出的 LATEST DETECTED DEADLOCK 區段包含一則訊息,指出 TOO DEEP OR LONG SEARCH IN THE LOCK TABLE WAITS-FOR GRAPH, WE WILL ROLL BACK FOLLOWING TRANSACTION,則表示等待清單上的交易數量已達到 200 的限制。超過 200 個交易的等待清單會被視為死鎖,而嘗試檢查等待清單的交易會被回滾。如果鎖定執行緒必須查看等待清單上交易擁有的超過 1,000,000 個鎖定,也可能會發生相同的錯誤。

如需組織資料庫操作以避免死鎖的技術,請參閱第 17.7.5 節,「InnoDB 中的死鎖」

停用死鎖偵測

在高並行系統上,當許多執行緒等待相同鎖定時,死鎖偵測可能會導致效能下降。有時,停用死鎖偵測並在發生死鎖時依賴 innodb_lock_wait_timeout 設定進行交易回滾可能更有效率。可以使用 innodb_deadlock_detect 變數停用死鎖偵測。