事务 与 更新丢失的问题?

发布于 2022-09-04 07:52:48 字数 294 浏览 19 评论 0

先查询某一行的值,然后在更新这个值。在高并发的情况下,A 用户 查出来的值比如是 8,这时候按着8进行处理过程中,有另外的用户B,将这个值改成了10,当A用户再去更新的时候,就会造成数据的更新丢失。

通过对查询更新方法设置事务,加入防重复读的隔离级别,也是解决不了更新丢失问题的。防重复读,只能保证第一次读到是8,后面在怎么读这条记录,结果都是8。

解决这个问题,在mysql 数据库层面,只有用for update (悲观锁)或是乐观锁来锁住这一行记录。

问题是,对于事务与mysql悲观锁的理解有点混沌了。请高人给指点迷津。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

紫竹語嫣☆ 2022-09-11 07:52:48

WHERE里加条件:

SELECT quantity FROM products WHERE id=3; 假设读到的quantity为8
UPDATE products SET quantity = '10' WHERE id=3 AND quantity=8;
不必了 2022-09-11 07:52:48

开启事务状态下mysql的默认隔离级别已经可以解决这个问题了吧。

冷…雨湿花 2022-09-11 07:52:48

例如
SET AUTOCOMMIT=0; BEGIN WORK;
SELECT quantity FROM products WHERE id=3 FOR UPDATE;
UPDATE products SET quantity = '1' WHERE id=3 ;
COMMIT WORK;

你可以开启事物。
然后在读取这行记录的时候给加上FOR UPDATE,把这条记录给锁住
使用 FOR UPDATE 必须使用事务,因为不使用事务这句话近似于没有FOR UPDATE,在事务中使用了 FOR UPDATE后, 在COMMIT/ROLLBACK之前,
其他会话如果读取到这个id=3这行会一直等待,等待你的事务结束,并读取新的行
其次 FOR UPDATE 最好用在 id = xx 或 id in (xx,xx) 不然数据库会降级为锁表

月寒剑心 2022-09-11 07:52:48

事务有4个级别
读提交,读未提交,可重读,串行化
你仔细的描述一下你的需求,我看看!

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文