一致性非锁定读:是指innoDB 存储引擎通过多版本控制的方式来读取当前执行时间数据库中的行的数据。如果读取的行正在执行delete,update操作,这是读取操作不会因此而进行等待行上的锁的释放,相反innodb存储引擎会执行读取行的一个快照数据
快照的产生:当事务开始时(begin)会产生一个快照数据(该数据存放在undo段里)之后在在其他事物进行查询时就会读取当前快照数据不同事物级别读取的快照也是不同的如read commited 总是是读取该数据的最新快照(存放在undo段里,其位于共享表空间,快照数据不唯一) repeatable read 读取事物开始时的最新快照数据
ps 快照数据是存放在undo 段里 undo的作用是当修改一条数据是redo会产生一条修改操作,而undo会产生redo相反的数据以用来事务回滚,因此是不是说只有修改数据是才会产生快照呢?是不是多事务并行是只要没有发生update,delete时快照是不会产生的呢?这个地方有疑问
事物级别 repeatable read数据库默认级别
1.开启事物1并查询
2.开启事物2并查询
3.事物1修改该数据并查询
4.事物2 再次查询
就会发现数据不一致。首先来说因为事务的隔离性使修改数据未提交时该数据不会被其他事物发现。因此查询是还是之前的数据,但是按理说如果该事务未提交且发生修改时其它事物是不能使用该资源的直到该数据上的x锁释放。因为该数据读取的是快照的数据
5.事务1提交事务
6.事物二在事务1提交后再次查询
这时你会发现查询的数据仍是之前的数据。明明数据已经修改了但是为什么查询的不是最新的数据这就是一致性非锁定读的缺点无法读取最新数据,因为他读取的是事务开始时的快照数据,而不是其他事物提交的数据
事务二提交事务并查询
这个时候查询就是最新的了。
undo数据不会再事务结束后就会删除而是根据其他事物是否会用的到来判定是否删除。在事务1提交事务时,事务2在使用快照,导致快照不会删除;而当事务2提交事务时其读取的快照没有被其他事务使用会跟者事务2的提交而删除。此时再次读取的就是最新的数据,而不是快照。
这种读叫做快照读;与之对应的是当前读(读取的是最新的数据)
当前读时会对数据进行加锁来读取最新数据如下
select * from tableName for update;(会加x锁,排他锁,阻止其他任何事务再次条数据中添加任何锁)
select * from tableName lock in share mode(s锁,共享锁,其他事务可以在此加s锁但是不能加x锁)
在一致性非锁定读中任然可以进行查询操作
下面使用for update ,lock in share mode 来进行查询