鎖是數據庫管理系統(DBMS)為了在併發環境下保證數據一致性、隔離性而引入的同步機制。通過限制對數據資源的並發訪問,防止臟讀、不可重複讀、幻讀等異常。
| 維度 | 分類 | 典型場景 |
|---|---|---|
| 按粒度 | 表鎖 | MyISAM、DDL 操作、全表掃描 |
| 行鎖 | InnoDB 默認、高併發 OLTP | |
| 按模式 | 共享鎖(S 鎖/讀鎖) | SELECT ... LOCK IN SHARE MODE |
| 排他鎖(X 鎖/寫鎖) | UPDATE/DELETE/INSERT、SELECT ... FOR UPDATE | |
| 意向鎖(IS/IX) | 多粒度鎖協議,表級標識行級鎖意圖 | |
| 按實現 | 悲觀鎖 | 數據庫層面加鎖,適用衝突頻繁場景 |
| 樂觀鎖 | 版本號/時間戳/CAS,應用層實現,適用讀多寫少 |
-- 事務 A
UPDATE accounts SET balance = balance - 100 WHERE id = 1;
UPDATE accounts SET balance = balance + 100 WHERE id = 2;
-- 事務 B(相反順序)
UPDATE accounts SET balance = balance - 100 WHERE id = 2;
UPDATE accounts SET balance = balance + 100 WHERE id = 1;
解決:統一訪問順序、縮短事務、降低隔離級別、使用 innodb_lock_wait_timeout。
查看 SHOW ENGINE INNODB STATUS 或 performance_schema.data_locks 定位阻塞鏈,優化慢 SQL、增加索引、拆分大事務。
UPDATE ... SET qty=qty-1, ver=ver+1 WHERE id=? AND ver=?。Innodb_row_lock_waits、Innodb_row_lock_time_avg 指標。參考經典博客:數據庫鎖詳細總結,涵蓋 MySQL/PostgreSQL/Oracle 鎖實現細節與案例分析。