表鎖語法
LOCK TABLES tbl_name [AS alias] {READ [LOCAL] | [LOW_PRIORITY] WRITE} [, ...];
UNLOCK TABLES;
InnoDB 行鎖特性
- 支援共享鎖(S)與排他鎖(X)
- 四大隔離級別:READ UNCOMMITTED、READ COMMITTED、REPEATABLE READ(預設)、SERIALIZABLE
- 行鎖實為「索引記錄鎖」,透過索引加鎖
死鎖偵測與處理
- InnoDB 自動偵測行鎖死鎖,回滾代價最小的事務。
- 無法偵測:
LOCK TABLES 表鎖、涉及非 InnoDB 引擎的鎖。
- 依賴
innodb_lock_wait_timeout(預設 50 秒)超時解決上述情況。
- 高併發更新場景若依賴超時,大量事務等待會拖垮系統。
避免死鎖最佳實踐
- 避免單一事務混合更新不同引擎表。
- 避免同類型表使用不同鎖定方式(如部分行鎖、部分表鎖)。
- 固定順序存取表與行。
- 縮短事務長度,降低衝突機率。