MySQL InnoDB一致性非锁定读


一致性非锁定读(consistent nonlocking read)是指InnoDB存储引擎通过多行版本控制的方式来读取当前执行时间数据库中行的数据。

如果读取的行正在执行delete或者update操作的时候,这时候的读取操作不会等待行锁的释放,而是会去读该行的一个快照数据【该行的之前版本的数据】。
可以看到,一致性非锁定读能够极大的提高数据库的并发性能。

但是,不同的事务隔离级别tx_isolation下面,读取的方式还是不一样的;
1, 并不是在所有的事务隔离级别下面都是采用一致性非锁定读
2, 即使是使用一致性非锁定读,读取的快照数据也是不一样的

例如,当tx_isolation=READ-COMMITTED, tx_isolation=REPREATABLE READ的时候,InnoDB存储引擎使用一致性非锁定读,但是二者对于快照数据的定义却不一样。
当tx_isolation=READ-COMMITTED,一致性非锁定读始终读取最新的一份快照数据;
当tx_isolation=REPREATABLE READ,一致性非锁定读始终读取事务begin时候的数据版本。

事务A 事务B
begin;
begin;
1. select * from phantom;
update phantom set a =100 where a=1;
commit;
2. select * from phantom;
commit;




在两个不同的会话中完成上述测试:

一. set session tx_isolation=READ-COMMITTED

首先在事务A中进行第一次查询:

    1. select * from phantom; a=1

执行事务B之后,在事务A中进行第二次查询(如果要在这里实现一致性锁定读,可以使用select * from phantom for update;):

    1. select * from phantom; a=100

二. set session tx_isolation=R=REPEATABLE-READ

首先在事务A中进行第一次查询:

    1. select * from phantom; a=1

执行事务B之后,在事务A中进行第二次查询(如果要在这里实现一致性锁定读,可以使用select * from phantom for update;):

    1. select * from phantom; a=1