MySQL行锁是程序员必懂的并发控制核心技术,能有效解决高并发场景下的数据冲突问题。本文深度解析记录锁、间隙锁和临键锁三种实现方式,通过真实案例演示如何避免死锁陷阱。掌握行锁优化技巧可大幅提升数据库性能,如缩短事务时长、精准命中索引等。文章还包含面试高频问题解答,如"如何防止超卖"的实战方案。访问面试鸭返利网可获取更多MySQL锁机制解析和大厂真题库,助你轻松应对Java面试挑战。
2025年Java面试宝典抢先领!
🔗 链接 提取码:9b3g
当面试官问“MySQL如何避免并发写冲突”时,行锁(Row-Level Lock) 就是核心答案。想象两个用户同时更新订单表的同一条数据:没有锁,余额可能被覆盖成错误值!而行锁能精准锁住目标数据行,其他事务必须排队等待。
记录锁(Record Lock)
UPDATE users SET balance=100 WHERE id=5id=5的记录加锁
间隙锁(Gap Lock)
SELECT * FROM users WHERE age BETWEEN 20 AND 30 FOR UPDATEage=20到age=30之间的空隙,阻止其他事务插入新数据临键锁(Next-Key Lock)
DELETE FROM orders WHERE order_id=100order_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的锁
✅ 避坑方案:
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锁机制深度解析 → 面试鸭返利网真题库
✅ 行锁 ✅ 间隙锁 ✅ 死锁排查 ✅ 高并发设计
(访问首页:面试鸭返利网 解锁全站面试秘籍)
扫码联系我返利
(当前返利8元,金额随官方实际价格波动,最好提前咨询)

面试鸭小程序码

美团大额优惠券,给自己加个鸡腿吧!

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