数据库事务并发和事务的隔离级别的关系?

发布于 2022-09-02 15:40:25 字数 283 浏览 14 评论 0

书上讲, 当数据库隔离级别为1级 read uncommit时, 一个事务可以访问其他事务修改未提交或插入未提交的数据. 当一个事务开始写, 就不允许其他事务同时写. read uncommit可以避免第一类更新丢失, 也就是一个事务回滚会覆盖其他事务已提交的数据.

假如有A,B两个事务并发执行, 当A提交一个数据之后, B也提交了数据, 此时A回滚, 不就会覆盖B的数据吗, 这也就是造成了更新丢失.

我不知道该怎么理解read commit可以避免更新丢失, 还是我想的这个例子有问题?还是说书上讲的是错误的?

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

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

发布评论

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

评论(2

难如初 2022-09-09 15:40:25

read commit情况下会有锁控制提交,同时有『快照读』处理纯select操作。针对4种不同的隔离级别mysql进行的锁处理和细节,有一篇文章介绍的很详细,例子也很清楚,可以看看这篇文章(原博主的博客现在访问出现问题,找了一篇转载的):http://blog.sae.sina.com.cn/archives/2127

檐上三寸雪 2022-09-09 15:40:25
  1. 第一段讲的是正确的。写写互斥,所以你第二个例子中的A、B两个写,B肯定会block到A事务结束(commit成功或Rollback),你这里的情况是rollback,那么A提交的数据不起作用,恢复初始值,在非read uncommited情况下,A的中间值B是不可见的,因此A的回滚对B没有影响,B继续commit执行,执行成功就把初始值覆盖成新值,执行失败则回滚,初始值还是原来的初始值。所以,没有覆盖一说。

  2. 关于第二类更新丢失。百度或谷歌下,似乎说是read committed会丢失,而repeatable read不会丢失。但是本人本地测试了下【Server version: 5.7.9 MySQL Community Server (GPL)】,RR下也丢失了。这个你也可以本地测试下。开个两个窗口(两个session),都使用begin开启事务A,B,A先update,B之后Update(这个会block),A再commit,block的B被提交,此时B也commit的话,B的值会覆盖Acommit的值使得A更新丢失。

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