1. 認識死鎖
死鎖是指兩個或者多個事務在同一資源上相互佔用,並請求鎖定對方佔用的資源,從而導致惡性循環的現象。
2. 爲什麼會產生死鎖
- 不同線程(不同事務)併發訪問同一張表的多行數據,未按照順序訪問導致死鎖
- 不同線程(不同事務)併發訪問多張表時,未按照順序訪問導致死鎖
3. 處理死鎖的兩種方式
- 檢測到死鎖的循環依賴,立即返回一個錯誤,將參數innodb_deadlock_detect 設置爲 on 表示開啓這個邏輯
- 等查詢的時間達到鎖等待超時的設定後放棄鎖請求。這個超時時間由innodb_lock_wait_timeout 來控制。默認是 50 秒。
4. 如何降低死鎖概率
- 更新SQL的where條件儘量用索引,避免全表掃描,因爲全表掃描會鎖住整張表
- 基於主鍵或者唯一索引更新數據,原因如上
- 減少範圍更新,尤其非主鍵、非唯一索引上的範圍更新,避免全表掃描
- 加鎖順序一致,儘可能一次性鎖定所有需要的記錄