MySQL中如何避免死鎖——如何最小化和處理死鎖

首先預告一下未來幾周要發佈的文章:

MySQL索引,如何優化SQL,事務相關的文章,Redis系列文章也會相繼推出。喜歡的讀者可以點擊關注。

死鎖是一個經典的問題在事務型數據庫中,因為msyql會自動的使用行級別的鎖,所以你會在執行update或者delete時候mysql會自動的鎖住索引記錄單行或者多行,這時可能會出現死鎖現象。

您可以使用以下技術來處理死鎖並減少發生死鎖的可能性:

1. 經常使用SHOW ENGINE INNODB STATUS命令查看mysql最近死鎖情況,這可以幫助您調整應用程序以避免死鎖。

2. 如果頻繁出現死鎖情況應該引起重視,打開innodb_print_all_deadlocks 設置後每一個死鎖會保存到mysql的error log中,分析解決死鎖情況。並關閉innodb_print_all_deadlocks 設置。

3. 應用程序中應該有死鎖發生後導致的事務回滾的重試代碼。

4. 保持事務小巧且持續時間短,以便事務不易發生衝突。

5. 如果使用鎖定讀取(SELECT ... FOR UPDATE或SELECT ... LOCK IN SHARE MODE),請嘗試使用較低的隔離級別,例如READ COMMITTED。

6. 修改事務中的多個表或同一表中的不同行時,每次都要以一致的順序執行這些操作,例如:將數據庫操作組織到應用程序內的函數中,或調用存儲過程(這種方法不推薦使用),而不是在不同位置編碼多個類似的INSERT,UPDATE和DELETE語句。

7. 創建合適的索引,以保證查詢需要掃描較少的索引記錄,因此設置較少的鎖。使用EXPLAIN SELECT優化你的sql。

8. 使用更少的鎖定。如果您可以允許SELECT從舊快照返回數據,請不要在其中添加FOR UPDATE或LOCK IN SHARE MODE子句, 這種情況下推薦使用READ COMMITTED隔離級別,因為同一事務中的每個一致讀取均從其自己的新快照讀取。


MySQL中如何避免死鎖——如何最小化和處理死鎖


以上僅為個人見解,如果有錯誤歡迎指出,喜歡的話可以點贊收藏評論轉發,後續會繼續推出MySQL系列文章。


分享到:


相關文章: