mvcc中的read_view
发表于:2025-01-21 作者:千家信息网编辑
千家信息网最后更新 2025年01月21日,innodb的mvcc和read view最近读High Performance MySQL,里面提到了innodb事务隔离级别是REPEATABLE-READ时,有这样一段话引用SELECTInno
千家信息网最后更新 2025年01月21日mvcc中的read_viewinnodb的mvcc和read view
最近读High Performance MySQL,里面提到了innodb事务隔离级别是REPEATABLE-READ时,有这样一段话
引用
SELECT
InnoDB must examine each row to ensure that it meets two criteria:
a. InnoDB must find a version of the row that is at least as old as the transaction
(i.e., its version must be less than or equal to the transaction's version). This
ensures that either the row existed before the transaction began, or the trans-
action created or altered the row.
b. The row's deletion version must be undefined or greater than the transaction's
version. This ensures that the row wasn't deleted before the transaction began.
Rows that pass both tests may be returned as the query's result.
来验证一下
表中有数据(1,1)
autocommit为false, tx_isolation 是REPEATABLE-READ
考虑以下两种情况
情况1
B处结果为(1,2),似乎不符合那段话里的a条件,A事务看到了transaction version更大的B事务
情况2
C处结果为(1,1),也就是说,A事务没有看到transaction version更小的B事务
是不是那段话有问题呢,后来终于找到了官方的文档,innodb通过read view来确定一致性读时的数据库snapshot,innodb的read view确定一条记录能否看到,有两条法则
1 看不到read view创建时刻以后启动的事务
2 看不到read view创建时活跃的事务
引用 Rule 1: When the read view object is created it notes down the smallest transaction identifier that is not yet used as a transaction identifier (trx_sys_t::max_trx_id). The read view calls it the low limit. So the transaction using the read view must not see any transaction with identifier greater than or equal to this low limit.
Rule 2: The transaction using the read view must not see a transaction that was active when the read view was created.
在情况1中,代码A处并没有创建read view,read view是在代码B处创建的.
如果把A处代码改为 START TRANSACTION WITH CONSISTENT SNAPSHOT;
才会创建read view,使得代码B返回(1,1)
在情况2中,B事务在A事务创建read view时处于ACTIVE状态,所以B事务不会被A事务看到.
这篇文章还提到了mysql5.6 在read only事务的优化,值得一看
最近读High Performance MySQL,里面提到了innodb事务隔离级别是REPEATABLE-READ时,有这样一段话
引用
SELECT
InnoDB must examine each row to ensure that it meets two criteria:
a. InnoDB must find a version of the row that is at least as old as the transaction
(i.e., its version must be less than or equal to the transaction's version). This
ensures that either the row existed before the transaction began, or the trans-
action created or altered the row.
b. The row's deletion version must be undefined or greater than the transaction's
version. This ensures that the row wasn't deleted before the transaction began.
Rows that pass both tests may be returned as the query's result.
来验证一下
show create table 20130302t1; CREATE TABLE `20130302t1` ( `id` int(11) NOT NULL, `b` int(11) NOT NULL, PRIMARY KEY (`id`)) ENGINE=InnoDB
表中有数据(1,1)
autocommit为false, tx_isolation 是REPEATABLE-READ
考虑以下两种情况
情况1
session A | session B |
start transaction;(A) | |
start transaction | |
update 20130302t1 set b=2 where id=1; | |
commit; | |
select * from 20130302t1;(B) |
B处结果为(1,2),似乎不符合那段话里的a条件,A事务看到了transaction version更大的B事务
情况2
session A | session B |
start transaction | |
update 20130302t1 set b=2 where id=1; | |
start transaction | |
select * from 20130302t1; | |
commit; | |
select * from 20130302t1;(C) |
C处结果为(1,1),也就是说,A事务没有看到transaction version更小的B事务
是不是那段话有问题呢,后来终于找到了官方的文档,innodb通过read view来确定一致性读时的数据库snapshot,innodb的read view确定一条记录能否看到,有两条法则
1 看不到read view创建时刻以后启动的事务
2 看不到read view创建时活跃的事务
引用 Rule 1: When the read view object is created it notes down the smallest transaction identifier that is not yet used as a transaction identifier (trx_sys_t::max_trx_id). The read view calls it the low limit. So the transaction using the read view must not see any transaction with identifier greater than or equal to this low limit.
Rule 2: The transaction using the read view must not see a transaction that was active when the read view was created.
在情况1中,代码A处并没有创建read view,read view是在代码B处创建的.
如果把A处代码改为 START TRANSACTION WITH CONSISTENT SNAPSHOT;
才会创建read view,使得代码B返回(1,1)
在情况2中,B事务在A事务创建read view时处于ACTIVE状态,所以B事务不会被A事务看到.
这篇文章还提到了mysql5.6 在read only事务的优化,值得一看
事务
情况
代码
数据
结果
一致
一致性
也就是
也就是说
会创
官方
数据库
文档
时刻
是在
条件
法则
状态
篇文章
级别
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
烟台中科网络技术有限公司
软件开发走什么科目
服务器不识别windows
saas系统的数据库用什么软件
数据库学习哪家好
怎么关闭服务器电源
数据库是一门研究数据管理的技术
阿里云存储数据的服务器价格
蓝思网络技术有限公司电话
大闹天宫修改数据库
南京金肯有网络安全专业吗
免费外卖软件开发
网络安全的心得800字
利用微信转账截图诈骗软件开发者
全球数据库个人信息
英雄无敌新开服务器
华为5g网络安全
图数据库与关系型数据库一起使用
促进网络安全与信息化工作
消逝的光芒2连接不上服务器
网络安全的三个基本标准
微软我的世界服务器延迟高
惠普服务器开机键盘无反应
计算机网络技术的知识讲解
荒野大镖客ps4服务器
服务器找不到网关的arp报文
小学生网络安全教育演练视频
充电柜软件开发
第三方网络安全认证证书
数据库中查询表中最后一行