Mysql INNODB不加锁一致性读

          InnoDB使用多版本策略处理SELECT语句,不同事务间执行SELECT语句时,都会产生相对于当前数据库某个时点的一个快照。不同事务间的查询语句只会看到在当前查询时点之前数据库已经提交的记录,在查询时点之后其他事务提交的数据或者未提交的数据将无法被查询到。特例是,查询语句可以查询到查询语句所在的当前事务未提交的记录。

         如果事务隔离级别是REPEATABLE_READ(默认事务隔离级别),事务间的所有一致性读(SELECT语句)只会读取到事务中第一条查询语句所建立的快照。当事务提交后,使用查询语句可以查询到最新的数据库记录。

         当事务隔离级别是READ_COMMITED时,事务中的每次SELECT语句查询,都会读取数据库最新的记录,也就是其他事务已提交的数据(其他事务未提交的还是不能被查到);

       在READ_COMMITED和REPEATABLE_READ事务隔离级别下,innodb执行SELECT语句默认是一致读(consistent read)。一致读不会对它查询覆盖的记录进行加锁。当执行一致读时,允许其他事务对查询到的记录进行修改。

       假设数据库的事务隔离级别设置为REPEATABLE_READ,你在某个事务中执行了一个SELECT查询语句,这时会默认执行一致读,InnoDB会对执行语句时点前的数据库记录建立快照。如果此时某个其他事务执行了DELETE语句或者INSERT,UPDATE语句,对于查询语句所在的当前事务来说,这些更改都是不可见的。

  如下示例,客户端A启用事务,并且执行SELECT语句:

START TRANSACTION;

SELECT * FROM t_trx_test2;

结果:

客户端B开启事务,并插入了一条记录:

START TRANSACTION;

INSERT INTO t_trx_test2 (id, name, code) VALUES (4, '4', '4');

客户端A再次执行查询语句(未提交事务):

SELECT * FROM t_trx_test2;

查询结果:

还是查询到之前的结果。

客户端B提交事务,客户端A提交事务并且再次执行查询语句:

COMMIT;

SELECT * FROM t_trx_test2;

查询结果如下,查询到了客户端B提交的记录:

当事务隔离级别设置为:READ_COMMITED时,事务A首次查询:

SET GLOBAL TRANSACTION ISOLATION LEVEL READ COMMITTED;
SELECT @@tx_isolation;
START TRANSACTION;

SELECT * FROM t_trx_test2;

查询结果:

事务B提交插入记录:

START TRANSACTION;

SELECT @@tx_isolation;
INSERT INTO t_trx_test2 (id, name, code) VALUES (4, '4', '4');

COMMIT;

事务A再次查询(事务A此时未提交),查询到了事务B提交的最新记录:

猜你喜欢

转载自blog.csdn.net/u013262534/article/details/81518466