爲什麼會出現死鎖?

1. 認識死鎖

死鎖是指兩個或者多個事務在同一資源上相互佔用,並請求鎖定對方佔用的資源,從而導致惡性循環的現象。

2. 爲什麼會產生死鎖

  • 不同線程(不同事務)併發訪問同一張表的多行數據,未按照順序訪問導致死鎖
  • 不同線程(不同事務)併發訪問多張表時,未按照順序訪問導致死鎖

3. 處理死鎖的兩種方式

  1. 檢測到死鎖的循環依賴,立即返回一個錯誤,將參數innodb_deadlock_detect 設置爲 on 表示開啓這個邏輯
  2. 等查詢的時間達到鎖等待超時的設定後放棄鎖請求。這個超時時間由innodb_lock_wait_timeout 來控制。默認是 50 秒。

4. 如何降低死鎖概率

  1. 更新SQL的where條件儘量用索引,避免全表掃描,因爲全表掃描會鎖住整張表
  2. 基於主鍵或者唯一索引更新數據,原因如上
  3. 減少範圍更新,尤其非主鍵、非唯一索引上的範圍更新,避免全表掃描
  4. 加鎖順序一致,儘可能一次性鎖定所有需要的記錄
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章