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

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

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

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

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


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


  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更新丢失。

【热门文章】
【热门文章】