什么是MVCC
MVCC简称多版本并发控制,旨在为了解决并发事务的问题,它主要是依据undolog,readview,和三个隐藏字段控制。
其实在表的每个记录,都存在三个隐式的字段,一般我们正常查询不到,分别是隐式主键,当我们创建一个表没有给他设置主键的时候就会使用隐式主键,第二个是回滚指针,我们知道undolog会记录我们事务提交前的版本,回滚指针就是指向这个旧版本的依据。第三个就是事务id,指的是最近的一次修改该记录的事务id,事务的id是自增的。
快照读:为了理解,你可以把它当作是一个记录副本,在不同事务隔离级别下快照读的方式是不一样的,在RC隔离级别下,事务中的每一次select都会创建一个快照,记住是每一次,而在RR隔离级别下,事务中的第一次select会创建快照,其他select都是读取这个快照,主要是为了解决不可重复读的问题,上篇文章说过。
当前读:读取的是当前数据库最新的版本。
快照读到底是怎么读的,怎么确定读那个版本?
这就要看readview,每一次快照读都会生成一个readview,他有一下几个属性 : m_ids当前活跃的事务,min_trx_id当前最小活跃事务的id,max_try_id当前最大活跃事务id+1,create_try_id,reedview创建者的事务id。 我们知道undolog会记录旧版本记录形成一个版本链,根据这个版本链我们可以一层一层遍历看哪个版本符合要求。
readview读取规则:
1.当前记录的事务id如果等于create_try_id,是不是说明该记录的版本是当前记录事务更改的,我自己的事务是不是能读到我自己所修改的内容。
2.当前记录的事务id小于min_try_id,我比最小的活跃事务id还小,是不是说明当前事务已经提交的呀。
3.当前记录事务id大于max_try_id, 说明当前事务是在readview生成之后开启的
4.当前记录事务id大于等于min_try_id并且小于等于max_try_id并且不在m_ids集合之间 说明当前事务已经提交了。
通过这些读规则我们就可以实现多版本并发控制的问题。