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