SQL 锁与并发控制
SQL锁:共享锁(S)/排他锁(X)/意向锁(IS/IX)、乐观锁(version字段CAS)、悲观锁(SELECT FOR UPDATE)、死锁排查(SHOW ENGINE INNODB STATUS/LOCK WAIT依赖图) · 难度:入门 · +10XP
SQL 锁与并发控制
当多个用户同时修改同一数据时,需要锁机制来防止数据错乱。理解乐观锁和悲观锁的区别,是设计高并发系统的关键。
悲观锁 —— SELECT FOR UPDATE
START TRANSACTION;
SELECT stock FROM products WHERE id=1 FOR UPDATE; -- 锁定该行
UPDATE products SET stock = stock - 1 WHERE id=1;
COMMIT; -- 释放锁
乐观锁 —— 版本号CAS
-- 读取时记录版本号
SELECT stock, version FROM products WHERE id=1;
-- 更新时检查版本号是否变化
UPDATE products SET stock=stock-1, version=version+1
WHERE id=1 AND version=当前版本号;
-- 如果affected rows=0,说明数据被其他人改过了,重试
动手练习
- 基础练习:用SELECT FOR UPDATE模拟两个会话同时扣减库存。
- 进阶应用:用乐观锁实现一个简单的并发安全计数器。
- 项目实战:评估项目中的并发场景,选择合适的锁策略。