首页/数据/数据库速查/SELECT ... FOR UPDATE / FOR SHARE 加锁读
本包目录(495 条)
MySQL 基础与连接36 条
SQL 语法52 条
用户与权限21 条备份与恢复56 条主从复制与高可用53 条性能与调优57 条Redis 命令96 条Redis 运维与场景124 条

SELECT ... FOR UPDATE / FOR SHARE 加锁读

显式加锁保证读-改-写的原子性:FOR UPDATE 排他锁、FOR SHARE 共享锁;加锁读会阻塞其他写。

数据库速查数据更新于 2026-10-12
用途悲观锁读取
语句SELECT … FOR UPDATE / FOR SHARE
要点必须在事务内、条件走索引

库存扣减范式

库存扣减范式
START TRANSACTION;
SELECT qty FROM stock WHERE sku='SKU-1' FOR UPDATE;
UPDATE stock SET qty = qty - 1 WHERE sku='SKU-1' AND qty > 0;
COMMIT;

跳过已锁行(8.0)

跳过已锁行(8.0)
SELECT id FROM jobs WHERE status='ready' ORDER BY id LIMIT 1 FOR UPDATE SKIP LOCKED;
FOR UPDATE 无索引条件会锁大量行甚至全表;等锁超时受 innodb_lock_wait_timeout 限制(默认 50 秒)。

易错点

  • 锁读取必须在事务中才有意义,autocommit=1 下单条语句锁立即释放
  • 锁顺序不一致会造成死锁,批量加锁场景要固定顺序

数据来源与参考

  • MySQL 8.0 Reference Manual: Locking Reads

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌