MySQL 锁机制:共享锁、排他锁与死锁排查
InnoDB 支持行级锁,正确理解锁机制可避免死锁和性能问题。
1. 锁类型
- 共享锁(S):
SELECT ... LOCK IN SHARE MODE,允许其他读,阻止写。 - 排他锁(X):
SELECT ... FOR UPDATE,阻止其他读写。 - 意向锁:表级,表示事务打算在行上加锁。
- 间隙锁(Gap Lock):锁定范围,防止幻读(RR 隔离级别下)。
2. 加锁示例
-- 共享锁
SELECT * FROM products WHERE id = 1 LOCK IN SHARE MODE;
-- 排他锁
SELECT * FROM orders WHERE order_id = 100 FOR UPDATE;3. 死锁排查
-- 查看当前事务
SELECT * FROM information_schema.INNODB_TRX;
-- 查看锁等待
SELECT * FROM information_schema.INNODB_LOCKS;
SELECT * FROM information_schema.INNODB_LOCK_WAITS;
-- 最近一次死锁日志
SHOW ENGINE INNODB STATUS\G4. 死锁预防策略
- 不同事务以相同顺序访问表。
- 减小事务大小,缩短锁持有时间。
- 使用
READ COMMITTED隔离级别减少间隙锁。 - 为表加索引,避免全表扫描导致锁表。
5. 监控锁等待超时
SHOW VARIABLES LIKE 'innodb_lock_wait_timeout'; -- 默认 50 秒
SET GLOBAL innodb_lock_wait_timeout = 30; 