Mysql如何處理死鎖

mpsky發表於2021-09-11

Mysql如何處理死鎖

MySQL有兩種死鎖處理方式:

  1. 等待,直到超時(innodb_lock_wait_timeout=50s)。

  2. 發起死鎖檢測,主動回滾一條事務,讓其他事務繼續執行(innodb_deadlock_detect=on)。

由於效能原因,一般都是使用死鎖檢測來進行處理死鎖。

死鎖檢測

死鎖檢測的原理是構建一個以事務為頂點、鎖為邊的有向圖,判斷有向圖是否存在環,存在即有死鎖。

回滾

檢測到死鎖之後,選擇插入更新或者刪除的行數最少的事務回滾,基於 INFORMATION_SCHEMA.INNODB_TRX 表中的 trx_weight 欄位來判斷。

避免發生死鎖的方法:

1、收集死鎖資訊:

  • 利用命令 SHOW ENGINE INNODB STATUS檢視死鎖原因。

  • 除錯階段開啟 innodb_print_all_deadlocks,收集所有死鎖日誌。

2、減少死鎖:

  • 使用事務,不使用 lock tables 。

  • 保證沒有長事務。

  • 操作完之後立即提交事務,特別是在互動式命令列中。

  • 如果在用 (SELECT ... FOR UPDATE or SELECT ... LOCK IN SHARE MODE),嘗試降低隔離級別。

  • 修改多個表或者多個行的時候,將修改的順序保持一致。

  • 建立索引,可以使建立的鎖更少。

  • 最好不要用 (SELECT ... FOR UPDATE or SELECT ... LOCK IN SHARE MODE)。

  • 如果上述都無法解決問題,那麼嘗試使用 lock tables t1, t2, t3 鎖多張表

推薦:

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/1806/viewspace-2833729/,如需轉載,請註明出處,否則將追究法律責任。

相關文章