MySQL的事务隔离级别,在实现上,数据库里会创建一个视图,访问的时候以视图的逻辑结果为准。在“可重读读”的隔离级别下,这个视图是在事务启动时创建的,整个事务存在期间都用这个视图。在“读提交”的隔离级别下,这个视图是在每个SQL开始执行的时候创建的。这里需要注意的是,“读未提交”隔离级别下直接返回记录的最新值,没有视图概念,而“串行化”隔离级别下直接用加锁的方式避免并行访问。
我们可以看到在不同的隔离级别下,数据库行为是有所不同的。Oracle数据库的默认隔离级别其 实就是“读提交”,因此对于一些从Oracle迁移到MySQL的应用,为保证数据库隔离级别的一致, 你一定要记得将MySQL的隔离级别设置为“读提交”。
其中“读提交”和“可重复读”比较难理解,所以我用一个例子说明这几种隔离级别。假设数据表T中 只有一列,其中一行的值为1,下面是按照时间顺序执行两个事务的行为。
mysql> create table T(c int) engine=InnoDB; insert into T(c) values(1);

我们来看看在不同的隔离级别下,事务A会有哪些不同的返回结果,也就是图里面V1、V2、V3 的返回值分别是什么。
(1)若隔离级别是“读未提交”, 则V1的值就是2。这时候事务B虽然还没有提交,但是结果已经被 A看到了。因此,V2、V3也都是2;
(2)若隔离级别是“读提交”,则V1是1,V2的值是2。事务B的更新在提交后才能被A看到。所以, V3的值也是2;
(3)若隔离级别是“可重复读”,则V1、V2是1,V3是2。之所以V2还是1,遵循的就是这个要求: 事务在执行期间看到的数据前后必须是一致的。
(4)若隔离级别是“串行化”,则在事务B执行“将1改成2”的时候,会被锁住。直到事务A提交后, 事务B才可以继续执行。所以从A的角度看, V1、V2值是1,V3的值是2。
476

被折叠的 条评论
为什么被折叠?



