Mysql 死鎖分析
阿新 • • 發佈:2021-07-01
1. 結論
- 死鎖檢查機制
- 當事務A需要獲取一個行鎖時(例如更新一行資料),假如需要獲取行1的鎖
- 檢查其他事務有沒有已獲取了行1的鎖。
- 如果有,例如事務B已獲取了行1的鎖。
- 繼續檢查事務B在等待的鎖,如果有,而且是事務A已獲取的鎖(例如行2的鎖)
- 事務A丟擲異常:
Deadlock found when trying to get lock; try restarting transaction
- 當事務A需要獲取一個行鎖時(例如更新一行資料),假如需要獲取行1的鎖
- 更新內容
- 獲取鎖後更新哪個欄位,和鎖是無關的。
- 例如事務A獲取行1鎖更新欄位1,事務B獲取行1鎖更新欄位2,雖然它們更新的欄位不一樣,但是鎖是一樣的,也會觸發死鎖。
2.實驗
程序1
update test_table set key1=1 where id=1
sleep 10s
update test_table set key1=2 where id=2
程序2
update test_table set key2=1 where id=2
sleep 10s
update test_table set key2=2 where id=1
假如程序1先執行,1s後執行程序2,結果:
- 程序1能成功commit
- 程序2在第2個update時報錯
- 儘管2個程序update的欄位不一樣,但是因為where語句一樣,mysql都是通過id主鍵索引來查詢資料,所以是鎖住了主鍵索引。