MySQL行锁示例解析:程序员必懂的并发控制实战
2025年Java面试宝典抢先领!
🔗 链接 提取码:9b3g
🧠 行锁是什么?为什么要用它?
当面试官问“MySQL如何避免并发写冲突”时,行锁(Row-Level Lock) 就是核心答案。想象两个用户同时更新订单表的同一条数据:没有锁,余额可能被覆盖成错误值!而行锁能精准锁住目标数据行,其他事务必须排队等待。
🔧 MySQL行锁的三种实现方式
-
记录锁(Record Lock)
- 锁定索引记录本身(即使表没索引,InnoDB也会建隐藏聚簇索引)
- 📌 示例:
UPDATE users SET balance=100 WHERE id=5
→ 对id=5的记录加锁

-
间隙锁(Gap Lock)
- 锁住索引记录之间的区间,防幻读
- 📌 场景:
SELECT * FROM users WHERE age BETWEEN 20 AND 30 FOR UPDATE
→ 锁住age=20到age=30之间的空隙,阻止其他事务插入新数据
-
临键锁(Next-Key Lock)
- 记录锁+间隙锁的组合(InnoDB默认)
- 📌 示例:
DELETE FROM orders WHERE order_id=100
→ 锁住order_id=100的记录+相邻区间
💥 行锁的死锁陷阱(面试高频!)
当事务A锁了行1、事务B锁了行2,且双方互相等待对方的锁时 → 死锁!
-- 事务A
UPDATE accounts SET amount=amount-100 WHERE id=1; -- 锁住id=1
UPDATE accounts SET amount=amount+100 WHERE id=2; -- 等待事务B释放id=2的锁
-- 事务B(相反顺序)
UPDATE accounts SET amount=amount-100 WHERE id=2; -- 锁住id=2
UPDATE accounts SET amount=amount+100 WHERE id=1; -- 等待事务A释放id=1的锁
✅ 避坑方案:
- 所有事务统一SQL操作顺序(如先更新id小的记录)
- 用
SELECT ... FOR UPDATE NOWAIT直接报错而非等待
🚀 行锁性能优化技巧
- 缩短事务时长
- 避免在事务内执行网络请求/复杂计算
- 精准命中索引
WHERE条件无索引 → 行锁退化为表锁!
- 监控锁竞争
SHOW ENGINE INNODB STATUS; -- 查看LATEST DETECTED DEADLOCK
💡 面试实战问答
面试官:“高并发下单场景,怎么防止超卖?”
你的回答:
“用InnoDB行锁 + 乐观锁。例如:
BEGIN;
-- 1. 检查库存(加行锁)
SELECT stock FROM products WHERE id=100 FOR UPDATE;
-- 2. 判断并更新
UPDATE products SET stock=stock-1 WHERE id=100 AND stock>0;
COMMIT;
行锁保证同一时间只有一个事务操作该商品,FOR UPDATE会锁住id=100的行。”
🎁 附:面试资源福利
如果需要面试鸭会员,通过👉 面试鸭返利网 找我可返现25元!海量大厂真题库+实战解析助你通关:

📌 本文总结高频考点,更多MySQL锁机制深度解析 → 面试鸭返利网真题库
✅ 行锁 ✅ 间隙锁 ✅ 死锁排查 ✅ 高并发设计
(访问首页:面试鸭返利网 解锁全站面试秘籍)


