首页/数据/SQL 速查/锁读:SELECT FOR UPDATE / FOR SHARE
本包目录(311 条)
查询基础33 条连接与子查询40 条聚合与窗口函数54 条函数速查60 条
变更与事务52 条
性能与执行计划72 条

锁读:SELECT FOR UPDATE / FOR SHARE

在事务里对行加锁再读写:解决“先查后改”的并发竞争;MySQL 与 PostgreSQL 语法接近,锁强度不同。

SQL 速查数据更新于 2026-10-12

示例

示例
BEGIN;
SELECT * FROM jobs
WHERE state = 'queued'
ORDER BY id
LIMIT 1
FOR UPDATE;    -- 排他锁

UPDATE jobs SET state = 'running' WHERE id = ...;
COMMIT;
FOR UPDATE排他锁:其它事务的锁读与写会等待
FOR SHARE共享锁:MySQL 8 取代 LOCK IN SHARE MODE;PG 同名
前提必须在事务内;autocommit 下语句结束即释放锁

易错点

  • WHERE 条件没有走索引时,锁定范围可能放大到扫描到的全部行(甚至近似全表),先确认执行计划再上线
  • 锁读语句必须在事务里成对使用:漏掉 BEGIN 时锁在语句结束就释放,防不住并发

数据来源与参考

  • MySQL 8.0 Reference Manual · Locking Reads
  • PostgreSQL Documentation · SELECT
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌