美文网首页
事务----可重复读能解决幻读???

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

作者: 枫叶忆 | 来源:发表于2019-05-26 12:00 被阅读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对于幻读的解决时不彻底的。



    相关文章

      网友评论

          本文标题:事务----可重复读能解决幻读???

          本文链接:https://www.haomeiwen.com/subject/bgextctx.html