InnoDB 和 MyISAM 對比
- Innodb 支援崩潰恢復
- InnoDB 支援事務
- InnoDB 支援行鎖
- B+Tree 葉子節點儲存內容不同
- MyISAM 記錄錶行總數,InnoDB 沒有
兩階段鎖
InnoDB 讀操作會使用 MVCC,而寫操作會使用寫鎖。
InnoDB 兩階段鎖協議:行鎖是在需要的時候加上的,並且要等到事務提交後才釋放。
減少鎖衝突
根據二階段鎖協議,如果事務中需要鎖多行,要把最可能造成鎖衝突、最可能影響併發度的鎖往後放。(減少鎖的持有時間)
死鎖和死鎖檢測
處理死鎖的策略
- 等待超時
innodb_lock_wait_timeout
,預設值50秒 - 死鎖檢測
innodb_deadlock_detect=on
並回滾事務
死鎖檢測在高併發更新同一資料行會使用大量CPU,現象是 CPU 使用率很高,但每秒執行的事務卻很少
- 如果業務一定不會出現死鎖,可以關掉死鎖檢測(不推薦)
- 使用分散式 Semaphore 控制更新同一行併發度
- 將一行拆除邏輯的多行