MySQL 数据库MVCC实现原理
MVCC是什么?
MVCC(多版本并发控制器) 是MySQL实现事物的一种设计方式,事物的四大隔离级别,读未提交、读已提交、可重复读、串行化,基于MVCC可以实现中间两种事物隔离级别,解决读写冲突的问题,提高数据库访问效率。
具体实现
具体实现依赖于 3个隐式字段,undo log,read view。
(1)三个隐式字段分别包括MySQL建表未指定id主键时,自动创建ROW_ID字段作为主键,最近一次修改当前记录的事物ID(DB_TRX_ID),上一个旧版本数据的地址(DB_ROW_TPR)
(2)undo log,数据被事务A修改时,会保存上一个版本记录到undo log中,当前记录DB_TRX_ID指更新为事务A的ID,DB_ROW_TPR值为上一条记录的地址
(3)read view,在事务中对数据进行查询操作时,会生成read view,保存几个关键信息,当前事物id,系统中正在活跃的事务id集合,最小活跃事务id,已出现最大事务id值+1
通过以上三个存在,来实现MVCC。简单描述一下流程,事务B对数据进行读操作,创建read view对象,然后对数据进行可见性分析,满足条件则食事务B可以读取数据,不行则根据数据DB_ROW_TPR字段值找上一个版本数据继续进行相同的操作,直到可以读取为止,可见性分析请看下图
这样,可以保证在事务B中对数据的读取不会收到其他事务的影响,不会产生脏读。
RR和RC情况下有什么区别?
唯一的区别就是在RR隔离级别下,在一个事务中对数据的读取只会在第一次创建read view,之后对该数据的读取都是依赖于同一个read view,那么就能保证每次读取内容都是一样的,即可重复读。而RC隔离级别下,每次对数据的读取都会创建一个最新的read view,他可以保证没有脏读,但是如果过程中有其他事务对数据作了修改并且提交,那么事务B也能够读到,既而产生不可重复读的问题。
最后,串行化是通过表锁实现,锁未释放前,其他事务无法对表进行操作,所以不会出现幻读的