innodb 也实现了mvcc ,

 

对于非锁定行读取 即非DML读取,也可以成为快照读取。

 

在一个事物中 ,事物开始的时候 ,会被分配一个全局的事物id,即把当前系统版本号作为当前事物的事物id,

这个当前系统版本号 会 随着 因事物的开启,和数据的dml 操作而递增。

 

而表的 每一行 也有两个版本号,一个是创建时间,一个是删除时间,也是系统版本号。

 

innodb 在读取的时候,只会读取 早于 或者等于该事物版本号的 行记录, 这有一个条件 就是 非锁定行读取, 就是平常的 select * from table,

 

而对于其他的 锁定行 dml读取 只会读取最新的数据行版本,

 

insert update delete 是锁定行读取。

 

总结 快照读取 只会读取 早于等于自己事物版本号的 行记录。

 

做个栗子

wKioL1bG3DWgJ7VHAAB0xjMzyyQ372.png