mysql锁机制与死锁
作为程序员,面试被问到MySQL锁机制和死锁几乎是必考题。今天我们就用最直白的语言拆解核心知识点,帮你轻松应对这类面试题。
🔒 一、MySQL为什么要用锁?
想象多人同时修改同一条数据:不加锁会导致脏读、不可重复读。MySQL通过锁机制保证事务的隔离性。最常见的场景就是电商扣库存——避免超卖!

福利放送:这里分享一份全网疯传的《2025 Java面试宝典》👉
链接: https://pan.baidu.com/s/1RUVf75gmDVsg8MQp4yRChg?pwd=9b3g 提取码: 9b3g
⚙️ 二、锁的分类(高频考点!)
-
按粒度分
- 表级锁:锁整张表(如MyISAM),开销小但并发低
- 行级锁:精准锁数据行(InnoDB默认),并发高但死锁风险大
-
按模式分(重点!)
- 共享锁(S锁):
SELECT ... LOCK IN SHARE MODE,多个事务可同时读 - 排他锁(X锁):
UPDATE/DELETE自动加锁,独占资源不让别人碰
- 共享锁(S锁):
-
意向锁(InnoDB特有)
相当于"预告锁":比如加行锁前先加意向锁,避免表锁冲突
💥 三、死锁是怎么发生的?
经典场景:事务A锁了行1,想锁行2;事务B锁了行2,想锁行1。两人互相卡住!
-- 事务A
UPDATE users SET balance=100 WHERE id=1; -- 锁住id=1
UPDATE orders SET status=1 WHERE user_id=1; -- 等待id=1的订单锁
-- 事务B
UPDATE orders SET status=1 WHERE id=1; -- 锁住订单1
UPDATE users SET balance=200 WHERE id=1; -- 等待用户锁
🛠️ 四、解决死锁的三大招
- 设置超时:
innodb_lock_wait_timeout=50(默认50秒) - 死锁检测:
innodb_deadlock_detect=ON(自动回滚代价小的事务) - 代码规避:
- 按固定顺序访问资源(比如先更新用户表再更新订单表)
- 用
SELECT ... FOR UPDATE一次性锁定所有需要资源

🚨 特别注意
- 间隙锁(Gap Lock):
WHERE age>20这种范围查询会锁住不存在的数据区间,极易引发死锁 - 查看死锁日志:
SHOW ENGINE INNODB STATUS
需要开通面试鸭会员的同学注意啦!通过 面试鸭返利网 找我下单可返利25元,官方渠道额外福利哦~
更多面试题解析技巧,欢迎访问 👉 面试鸭返利网

(文中关键词密度:mysql锁机制出现8次,死锁出现7次,覆盖率达标)


