MySQL 行鎖

廖子博發表於2024-10-15

InnoDB 和 MyISAM 對比

  • Innodb 支援崩潰恢復
  • InnoDB 支援事務
  • InnoDB 支援行鎖
  • B+Tree 葉子節點儲存內容不同
  • MyISAM 記錄錶行總數,InnoDB 沒有

兩階段鎖

InnoDB 讀操作會使用 MVCC,而寫操作會使用寫鎖。

InnoDB 兩階段鎖協議:行鎖是在需要的時候加上的,並且要等到事務提交後才釋放。

減少鎖衝突

根據二階段鎖協議,如果事務中需要鎖多行,要把最可能造成鎖衝突、最可能影響併發度的鎖往後放。(減少鎖的持有時間)

死鎖和死鎖檢測

處理死鎖的策略

  • 等待超時 innodb_lock_wait_timeout,預設值50秒
  • 死鎖檢測 innodb_deadlock_detect=on 並回滾事務

死鎖檢測在高併發更新同一資料行會使用大量CPU,現象是 CPU 使用率很高,但每秒執行的事務卻很少

  • 如果業務一定不會出現死鎖,可以關掉死鎖檢測(不推薦)
  • 使用分散式 Semaphore 控制更新同一行併發度
  • 將一行拆除邏輯的多行

相關文章