1. 程式人生 > 其它 >Mysql 死鎖分析

Mysql 死鎖分析

1. 結論

  1. 死鎖檢查機制
    1. 當事務A需要獲取一個行鎖時(例如更新一行資料),假如需要獲取行1的鎖
      1. 檢查其他事務有沒有已獲取了行1的鎖。
      2. 如果有,例如事務B已獲取了行1的鎖。
      3. 繼續檢查事務B在等待的鎖,如果有,而且是事務A已獲取的鎖(例如行2的鎖)
      4. 事務A丟擲異常:Deadlock found when trying to get lock; try restarting transaction
  2. 更新內容
    1. 獲取鎖後更新哪個欄位,和鎖是無關的。
    2. 例如事務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主鍵索引來查詢資料,所以是鎖住了主鍵索引。