并发更新同一行数据被覆盖,用版本号做乐观锁

两人同时读到 version=1,各自算完写回,后写的覆盖先写的,就是丢失更新。做法是写入时带版本条件。

语句里同时 set version = version + 1 和 where version = 读到的值,影响行数 0 说明被别人改过,重读再试。

重试要有上限,别写成死循环。

UPDATE account
   SET balance = ?, version = version + 1
 WHERE id = ? AND version = ?;
-- 影响行数为 0 表示写入失败,重读后重试
THE END
喜欢就支持一下吧
点赞9 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容