Mysql 四种 隔离级别学习(三)

上节我们学习了Read Committed隔离级别,在这种隔别级别下,可能会出现不可重复读,这一节,我们继续学习四种隔防级别中另一种Repeatable Read(可重读)

这是MySQL的默认事务隔离级别,它确保同一事务的多个实例在并发读取数据时,会看到同样的数据行。不过理论上,这会导致另一个棘手的问题:幻读 (Phantom Read)。简单的说,幻读指当用户读取某一范围的数据行时,另一个事务又在该范围内插入了新行,当用户再读取该范围的数据行时,会发现有新的“幻影” 行。InnoDB和Falcon存储引擎通过多版本并发控制(MVCC,Multiversion Concurrency Control)机制解决了该问题。

现在我们来举个例子说明一下 幻读,如:在test库里有一个表 tx, 表里有3条数据,别外特别注意,测试之前先把自动提交事务关闭,并把隔离级别设置成Repeatable Read,如下图:

1.png

这时,客户端B也开启了一个事务,(特别说明:因为这里是测试,所以客户端B也要先设置好当前会话的隔离级别和关闭自动提交事务,要和客户端A保持一致),并更新了一条数据,并提交事务,如下图

2.png

特别注意:此时的客户A还没有提交事务,这时,客户A来查询数据会还是不变,如:

3.png

这种情况下,就不会像上一节,我们学的Read Committed(读取提交内容)级别下的,同一事务,不同时刻读到的数据不一致。我们再做一次插入数据,如下图:

4.png

客户端还是原来的数据。注意:客户端A在这时可能会出现新的数据,即客户端B新添加的数据,这就是会幻读;当客户端A提交事务后,就会得到新的数据。

由以上的实验可以得出结论,可重复读隔离级别只允许读取已提交记录,但是可能产生幻读问题(注意是可能,因为数据库对隔离级别的实现有所差别),像以上 的实验,就没有出现数据幻读的问题。InnoDB和Falcon存储引擎通过多版本并发控制(MVCC,Multiversion Concurrency Control)机制解决了该问题。

好了,在此希望能帮助初学者,明天我们继续一起学习另一种隔离级别。如果哪有不明白或写错的,请高手留言说明,以免会误导其它朋友。谢谢!

未经允许不得转载:易读小屋  »  Mysql 四种 隔离级别学习(三)