网上说MVCC定义也有很多,有的好像对,有的却可以自己推出反例,那么我们从实验结果出发和源码去探讨一下什么是MVCC,内容简单请大家耐心看看
首先隔离级别这个相信大家都知道了,MVCC主要作用于读已提交和可重复读。为什么呢?
1.因为读未提交是什么隔离都不做,那就是啥都不干那就不用咯。
2.串行化都一个一个来哪还有什么并发。
前提是innodb的存储引擎,本文只适用于innodb
然后我们来了解一下mysql中的3个隐藏属性
首先隐藏属性1
备用主键,当你的表没有设置主键时那么就会启用备用主键,主要用于主键索引(个人理解,错误请大家指出谢谢大家)。
隐藏属性2(mvcc关键点)
最后一次操作该数据的事务的id(每次创建事务都会根据最新的事务的标识符+1)
隐藏属性3
用于回滚的指针
首先我们先解决第一个问题,mysql如何实现读已提交。
在读已提交的隔离级别下,每一次操作(注意是每一次操作)都会生成一个当前活跃的事务的id的集合数组,称为read view。
读已提交读取的数据:
1.事务id不在活跃事务数组(read view)
2.事务id是自己本身事务的数据
name | 事务id | 回滚指针 |
---|---|---|
小明 | 3 | 暂时先不管了 |
当前的事务的id为4 活跃事务数据[4] 那么是可以查到这一条数据的
那么这个时候开始事务5,他修改了这一条数据
修改后的数据
name | 事务id | 回滚指针 |
---|---|---|
小明 | 3 | 暂时先不管了 |
新小明 | 5 | 上面那条 |
在事务4查询的时候会再次生成一个read view即活跃的事务数组[4,5]那么事务4是无法查询到这一条数据的,那么他之后根据指针往回走 找到上面这一条事务id为 3 的数据 那么他就可以 返回该结果了
注意:此时事务5并没有提交
然后事务5提交了之后又会怎么样呢
事务4再次查询&