优化类

mysql innodb 一致性非锁定读(多版本控制MVCC)二

2019-07-25  本文已影响0人  simians
  上次主要测试的是repeatable read 级别的事物来进行测试的,本次测试read commited与repeatable read 来进行测试。来进行比较两个事务隔离级别的不同之处

  两个事务都是使用了一致性非锁定读,但是他们的读取快照方式是不同的。
  相对于repeatable read ,read commited 事物没有解决不可重复读的问题,原因在于read commited 读取的快照总是最新的,repeatable read 读取的总是事物开始是产生的快照。在此期间产生的新快照是不影响repeatable read 的。下面就测试一下repeatable read 是否只是读取最新快照。
   思路是:开启三个事物,两个read commited,一个repeatable read,一个read commited 提交事务 对比未提交的read commited 与未提交的repeatable read 事物在查询的时候有什么不同,两种结果,一种是一样,一种是不一样,不一样的说明这两种事物读取的快照是不同的,即read commited 读取的是最新快照,repeatable read 读取的是事务开始时的快照;

ps:我是用的mysql 数据库版本是8其设置数据库的隔离级别和之前的不同

 早期版本是用tx_isolation 来进行设置的
 比如:set session @@tx_isolation=Read commited;
 现在的是使用 set session trasaction_isolation level Read commited;
如果是8的版本使用老的会报错

事务一 read commited
read commited 事务一
read commited 事务一
事务 reapeatable read
事务 reapeatable read
事务 reapeatable read
事务二 read commited
事务二 read commited

事务二在提交修改的数据的事务后可以得到如下结果

  事务一 read commited 查询数据发生了改变user_name 从tst1改为tst2
  事务 repeatable read 查询数据时数据为发生变化user_name 仍为tst1

  这样大概可以说明read commited 级别的事物在其他事物提交的时候如果发生数据变化,read commited 可以即可感知查询到,而repeatable read 级别的事物在其他事物提交的时候数据发生修改,它是感知不到的,因为该级别只能读取该级别开始事物是的最新快照,而在开启过程中产生的快照是不会进行读取的。
  这也从另一方面验证了read commited 级别的事务时无法做到可重复读的,因为它总是读取最新的快照,导致数据读取前后不一致。
  repeatable read 因为总是读取事务开始是的快照,即使其他事务提交修改数据,该级别仍然读取的是老的快照,因此读取的数据是前后一致的,这也就实现了可重复的。

这也间接的证明这两个事务的隔离级别所解决的问题:
  read commited 解决了脏读
  repeatable read 解决了不可重复读。
上一篇 下一篇

猜你喜欢

热点阅读