Mysql INNODB不加锁一致性读

InnoDB通过多版本并发控制实现一致性读,不加锁。在REPEATABLE_READ隔离级别下,事务内所有SELECT看到的是第一条查询时的快照;在READ_COMMITTED级别下,每次SELECT看到最新已提交记录。事务内部的一致性读不会锁定查询到的记录,允许其他事务修改。示例展示了不同隔离级别下,事务A如何在未提交时观察到或不观察到事务B的更改。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

          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;

结果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值