数据库事务并发和事务的隔离级别的关系?
书上讲, 当数据库隔离级别为1级 read uncommit时, 一个事务可以访问其他事务修改未提交或插入未提交的数据. 当一个事务开始写, 就不允许其他事务同时写. read uncommit可以避免第一类更新丢失, 也就是一个事务回滚会覆盖其他事务已提交的数据.
假如有A,B两个事务并发执行, 当A提交一个数据之后, B也提交了数据, 此时A回滚, 不就会覆盖B的数据吗, 这也就是造成了更新丢失.
我不知道该怎么理解read commit可以避免更新丢失, 还是我想的这个例子有问题?还是说书上讲的是错误的?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
read commit情况下会有锁控制提交,同时有『快照读』处理纯select操作。针对4种不同的隔离级别mysql进行的锁处理和细节,有一篇文章介绍的很详细,例子也很清楚,可以看看这篇文章(原博主的博客现在访问出现问题,找了一篇转载的):http://blog.sae.sina.com.cn/archives/2127
第一段讲的是正确的。写写互斥,所以你第二个例子中的A、B两个写,B肯定会block到A事务结束(commit成功或Rollback),你这里的情况是rollback,那么A提交的数据不起作用,恢复初始值,在非read uncommited情况下,A的中间值B是不可见的,因此A的回滚对B没有影响,B继续commit执行,执行成功就把初始值覆盖成新值,执行失败则回滚,初始值还是原来的初始值。所以,没有覆盖一说。
关于第二类更新丢失。百度或谷歌下,似乎说是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更新丢失。