千家信息网

怎么理解Innodb一致性非锁定读

发表于:2025-11-07 作者:千家信息网编辑
千家信息网最后更新 2025年11月07日,这篇文章主要讲解了"怎么理解Innodb一致性非锁定读",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"怎么理解Innodb一致性非锁定读"吧!一致性非锁
千家信息网最后更新 2025年11月07日怎么理解Innodb一致性非锁定读

这篇文章主要讲解了"怎么理解Innodb一致性非锁定读",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"怎么理解Innodb一致性非锁定读"吧!

一致性非锁定读指InnoDB通过多版本控制(MVCC)的方式在某个时间点通过查询数据库快照数据来读取数据。

RR事务隔离级别下,在一个事务中第一次(select)数据的时候创建快照,快照是在第一次select之前所有提交的数据的最新版本的数据,在此事务结束之前,select到的数据是一致的(快照)。

注意:Beginstart transaction开启事务的时候快照并没有创建,而是第一次select读数据时候创建。

如下:

Session A

Session B

Session A>drop table t;
Session A>create table t(x int primary key);
Session A>insert into t values (1),(5);
Session A>begin;
Session A>select @@tx_isolation;
+-----------------+
| @@tx_isolation |
+-----------------+
| REPEATABLE-READ |
+-----------------+
Session A>select * from t where x=5 for update;

 

上面的for update进行的锁定读,此时并没有创建read view注意:for updatelock in share mode都是锁定读,此时并不会创建快照

Session B>begin;
Session B>select @@tx_isolation;
+-----------------+
| @@tx_isolation |
+-----------------+
| REPEATABLE-READ |
+-----------------+
1 row in set (0.00 sec)
Session B>insert into t select 3;
Session B>commit;

Session A>select * from t; #此时才创建read view 生成快照
+---+
| x |
+---+
| 1 |
| 3 |
| 5 |
+---+

 你可能会发现RR隔离级别,不是应该看不到其他事务修改的数据吗?这正是因为begin开启一个事务,不是begin的时候创建read view,而是第一次进行快照读的时候才创建

innodb的READ COMMITTED和REPEATABLE READ隔离级别下执行select操作,默认模式就是一致性读。

一致性读不会对访问的表加任何锁,因此,其他会话可以任意的修改对象数据而不会影响当前会话的一致性读。

RR隔离级别下,某个时间点开启一个事务T1查询表的数据,接着开启另外一个新的事务T2对其deleteupdateinsert数据并且commit成功后,在T1中无法看到T2修改并且提交的结果。

注意:快照读主要适用于在一个事务中的select语句。所以事务中的DML语句是可以看到其他session中的事务的更新的,即时SELECT并不能看到这些

例如,同时开启事务T1T2T3,T1中删除或者修改表t的数据,在T2select查询的结果(快照读)是之前的t的数据(T2事务开启时间点的前t的数据),T3对表t修改或者删除可能会影响刚才T1提交的行。

下面的例子中:Session A只有在Session Binsert操作commit完成,并且Session A自身事务commit之后才能看到Session B插入的数据

可以使用READ COMMITTED或locking read(SELECT * FROM t LOCK IN SHARE MODE;)来查看表最新的数据。

一致性读不适用于特定的DDL语句如DROP TABLEALTER TABLE

另外,对于 INSERT INTO ... SELECT, UPDATE ... (SELECT)CREATE TABLE ... SELECT操作,虽然后面的select未指定FOR UPDATELOCK IN SHARE MODE,但此时的selectREAD COMMIT隔离级别下的SELECT一样,读取最新版本数据(使用的当前读)。

如下:

Session A

Session B

ession A>create table a (x int primary key,y int);
Query OK, 0 rows affected (0.17 sec)
#开启一个新事务
Session A>begin;
Query OK, 0 rows affected (0.00 sec)

Session A>select * from a;
Empty set (0.00 sec)
#插入数据
Session A>insert into a select 1,2;
Query OK, 1 row affected (0.00 sec)
Records: 1 Duplicates: 0 Warnings: 0
#当前事务能看到insert的数据
Session A>select * from a;
+---+------+
| x | y |
+---+------+
| 1 | 2 |
+---+------+
1 row in set (0.00 sec)#暂时不commit

 

 

#在A提交之前,B开启事务 Session B>begin;
Query OK, 0 rows affected (0.00 sec)
#此时查询表a的数据,一致性非锁定读,读到的是事务开启前已经提交的数据,因为B的事务开始的时候A事务还没有提交,故Ainsert的数据不会显示
Session B>select * from a;
Empty set (0.00 sec)

#session A提交上面的事务 Session A>commit;
Query OK, 0 rows affected (0.00 sec)

 

 

#在Bselect查询,依旧进行的是快照读,故看不到数据 Seesion B>select * from a;
Empty set (0.00 sec)

Seesion B>select * from aa;
Empty set (0.00 sec)
#INSERT INTO ... SELECT * FROM A;操作
Seesion B>insert into aa select * from a;
Query OK, 1 row affected (0.00 sec)
Records: 1 Duplicates: 0 Warnings: 0

Seesion B>select * from a;
Empty set (0.00 sec)
#发现直接selecta还是查不到数据,而aa表能看到数据
Seesion B>select * from aa;
+---+------+
| x | y |
+---+------+
| 1 | 2 |
+---+------+
1 row in set (0.00 sec)

 

#使用lock in share modefor update进行当前读能看到表a的数据
Seesion B>select * from a lock in share mode;
+---+------+
| x | y |
+---+------+
| 1 | 2 |
+---+------+
1 row in set (0.00 sec)

Seesion B>select * from a;
Empty set (0.00 sec)
Seesion B>select * from a for update;
+---+------+
| x | y |
+---+------+
| 1 | 2 |
+---+------+
1 row in set (0.00 sec)

当innodb_locks_unsafe_for_binlog选项为1时(关闭GAP锁),在READ UNCOMMITTED, READ COMMITTED, REPEATABLEREAD隔离级别下,select查询表的数据,不会对数据进行锁定,而都是一致性读。
感谢各位的阅读,以上就是"怎么理解Innodb一致性非锁定读"的内容了,经过本文的学习后,相信大家对怎么理解Innodb一致性非锁定读这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是,小编将为大家推送更多相关知识点的文章,欢迎关注!

数据 事务 一致 一致性 快照 时候 级别 查询 隔离 第一次 面的 时间 查询表 版本 语句 学习 内容 就是 结果 而是 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 软件开发专家评审内容范文 数据库设置默认表空间 数据库设计的三大范式通俗解释 腾讯云服务器端口映射 达梦数据库连接串 车载mp5显示服务器内部错误 网络安全教育宣传日简报 出租汽车买卖软件开发 金山区口碑好的网络技术优化 系统集成数据库维保标书 新乡市荣耀网络技术 培养网络安全人才国家安全 软件开发周报模版 失落的方舟欧美服怎么换服务器 吃鸡的服务器怎么换 年龄数据库 网络安全对国际贸易影响摘要 网络安全英文名字缩写 世界上有两个国家的服务器 奇安信网络安全基础 大话西游2乌鸡国变什么服务器了 数据库电子表格 山东网络安全大赛什么时候开战 协同办公软件开发的企业有哪些 服务器可以加几个阵列卡 金山区口碑好的网络技术优化 数据库connect是什么意思 廊坊木头公园网络技术 服务器管理系统的详细解读 软件开发 公众号
0