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

乐观锁:版本号条件更新

不提前加锁,用版本号在 UPDATE 时校验:更新影响行数为 0 说明发生并发修改,业务层决定重试或报冲突。

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

示例

示例
UPDATE documents
SET content = '...', version = version + 1
WHERE id = 42 AND version = 7;
-- 影响行数 1:成功;0:版本冲突,重新读取后再试
读取SELECT 时记住 version(或 updated_at/xmin)
更新WHERE 带旧版本号 + SET version+1
判定row count 0 即冲突;配合重试或提示用户
PostgreSQL 也可用系统列 xmin 作版本:UPDATE ... WHERE xmin::text = '…',省一个业务列但要理解 MVCC 语义。

易错点

  • 忘带 WHERE version 只 SET version+1:锁形同虚设,并发覆盖照样发生
  • MySQL affected rows 的口径(changed)会让“值未变化”的更新返回 0,冲突判定要与连接标志口径统一

数据来源与参考

  • PostgreSQL Documentation · Concurrency Control
  • MySQL 8.0 Reference Manual · UPDATE
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌