事务----可重复读能解决幻读???

2019-05-26  本文已影响0人  枫叶忆

测试可重复读

------------------

建表

关闭事务自动提交

SET AUTOCOMMIT =0;

设置隔离级别为可重复读

[A]

1)mysql>commit ;

2)mysql>set session transaction isolation level repeatable read ; -- 可以重复读

3)mysql>start transaction ; -- 开始事务

4)mysql>select * from mytable ; -- 查询

9)mysql>select * from mytable  ;

尽管B事务更新了age=100,A事务查询结果并未受到影响,避免了不可重复读。

[B]

5)mysql>commit;

6)mysql>start transaction ;

7)mysql>update mytable set age = 100 where id = 1; -- 更新

8)mysql>commit;

再测试可重复读能否避免幻读

[A]

1)mysql>commit ;

2)mysql>set session transaction isolation level repeatable read ; -- 可重复读

3)mysql>start transaction ; -- 开始事务

4)mysql>select * from mytable; -- 查询

9)mysql>select * from mytable ;

并未出现幻读???

提交后,再次查询:

[B]

5)mysql>commit;

6)mysql>start transaction ;

7)mysql>insert into mytable (name,age) values('tomas',66); -- 更新

8)mysql>commit;


总结:可重复读可以解决幻读?  能,但是是一部分!!!

上链接:


https://juejin.im/post/5c9040e95188252d92095a9e

文中提到:

可重复读取(Repeatable Read):禁止不可重复读取和脏读取,但是有时可能出现幻读数据。读取数据的事务将会禁止写事务(但允许读事务),写事务则禁止任何其他事务。Mysql默认使用该隔离级别。这可以通过“共享读锁”和“排他写锁”实现,即事务需要对某些数据进行修改必须对这些数据加 X 锁,读数据时需要加上 S 锁,当数据读取完成并不立刻释放 S 锁,而是等到事务结束后再释放。

     最终总结:测试结果告诉我们其实在MySQL可重复读的隔离级别中并不是完全解决了幻读的问题,而是解决了读数据情况下的幻读问题。

而对于修改的操作依旧存在幻读问题,就是说MVCC对于幻读的解决时不彻底的。



上一篇下一篇

猜你喜欢

热点阅读