首页 >文档 > mysql锁机制与死锁

mysql锁机制与死锁

MySQL锁机制与死锁问题是数据库面试必考核心知识点。本文深入解析MySQL表级锁、行级锁、共享锁和排他锁的区别,详细讲解InnoDB意向锁的工作原理。针对死锁问题,提供三大解决方案:设置超时参数、开启死锁检测和代码规避技巧,并特别提醒间隙锁的风险。通过电商库存案例和SQL示例,帮助开发者理解锁机制的应用场景和死锁产生原理,掌握SHOW ENGINE INNODB STATUS查看死锁日志的方法,提升数据库并发处理能力。

mysql锁机制与死锁

作为程序员,面试被问到MySQL锁机制和死锁几乎是必考题。今天我们就用最直白的语言拆解核心知识点,帮你轻松应对这类面试题。

🔒 一、MySQL为什么要用锁?

想象多人同时修改同一条数据:不加锁会导致脏读、不可重复读。MySQL通过锁机制保证事务的隔离性。最常见的场景就是电商扣库存——避免超卖!

面试鸭返利网

福利放送:这里分享一份全网疯传的《2025 Java面试宝典》👉
链接: https://pan.baidu.com/s/1RUVf75gmDVsg8MQp4yRChg?pwd=9b3g 提取码: 9b3g

⚙️ 二、锁的分类(高频考点!)

  1. 按粒度分

    • 表级锁:锁整张表(如MyISAM),开销小但并发低
    • 行级锁:精准锁数据行(InnoDB默认),并发高但死锁风险大
  2. 按模式分(重点!)

    • 共享锁(S锁)SELECT ... LOCK IN SHARE MODE,多个事务可同时读
    • 排他锁(X锁)UPDATE/DELETE自动加锁,独占资源不让别人碰
  3. 意向锁(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; -- 等待用户锁

🛠️ 四、解决死锁的三大招

  1. 设置超时innodb_lock_wait_timeout=50(默认50秒)
  2. 死锁检测innodb_deadlock_detect=ON(自动回滚代价小的事务)
  3. 代码规避
    • 按固定顺序访问资源(比如先更新用户表再更新订单表)
    • SELECT ... FOR UPDATE一次性锁定所有需要资源

面试鸭返利网

🚨 特别注意

  • 间隙锁(Gap Lock)WHERE age>20这种范围查询会锁住不存在的数据区间,极易引发死锁
  • 查看死锁日志SHOW ENGINE INNODB STATUS

需要开通面试鸭会员的同学注意啦!通过 面试鸭返利网 找我下单可返利25元,官方渠道额外福利哦~

更多面试题解析技巧,欢迎访问 👉 面试鸭返利网

面试鸭返利网

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

如果你想获取更多关于面试鸭的优惠信息,可以访问面试鸭返利网面试鸭优惠网,了解最新的优惠活动和返利政策。

🎯 立即加入面试鸭会员 →

今日有支付宝大红包赶快领,手慢无

支付宝红包二维码

支付宝扫码领取1-8元无门槛红包

支付宝红包二维码