mvcc机制中repeatableread的一些问题

2个会话session,分别开启2个事务。

第一个select后等待,第二个会话事务insert了一条记录laoqi

mvcc机制中repeatableread的一些问题

mvcc机制中repeatableread的一些问题

测试,如果第一个会话事务这时候update的是id=1的数据,则下个select还是只是查的三四五六的数据,三的数据为更改后的数据。如果update的是他非repeatable的三四五六的新的qi的数据则下次select的是三四五六七。

原来我一直以为只要在事务内insert/update/delete任何条件都会同步成最新数据的快照下次select都是最新的快照数据,看来不对。只有操作到了的新数据才会被同步,下个select会带回来。

 

MVCC事务版本号不同语句产生的原则

INSERT

InnoDB为新插入的每一行保存当前系统版本号作为版本号.

DELETE(delete)

InnoDB会为删除的每一行保存当前系统的版本号(事务的ID)作为删除标识.

根据update的更新原则:会生成新的一行,并在原来要修改的列的删除时间列上添加本事务ID,得到表如下:

id name 创建时间(事务ID) 删除时间(事务ID)
1 yang 1 4
2 long 1 5
3 fei 1 undefined
4 tian 3 undefined
2 Long 5 undefined

SELECT

InnoDB会根据以下两个条件检查每行记录:
a.InnoDB只会查找版本早于当前事务版本的数据行(也就是,行的系统版本号小于或等于事务的系统版本号),这样可以确保事务读取的行,要么是在事务开始前已经存在的,要么是事务自身插入或者修改过的.
b.行的删除版本要么未定义,要么大于当前事务版本号,这可以确保事务读取到的行,在事务开始之前未被删除.
只有a,b同时满足的记录,才能返回作为查询结果