MVCC全称为Multi Version Concurrency Control
,直译为多版本并发控制
,是MySQL中一种并发控制的方法,他主要是为了提高数据库的读写性能,用更好的方式去处理读写冲突。
在讲述MVCC机制实现原理之前,我们先了解一下当前读和快照读
当前读:
其实也很容易理解,当前读指的就是读取的是最新的记录,读取的时候还需要保证其他事务不能修改当前记录,所以会对读取的记录进行加锁处理
例如:select for update 、update、insert、delete这些操作都是当前读
快照读:
而快照读也就是不加锁的select,不过需要注意的是快照读的前提是隔离级别不能是serializable(可串行化),之所以出现快照读,是基于提高并发性能的考虑
其实可以简单理解成MVCC就是为了实现读写冲突的时候不去加锁
其实在MySQL中每一条记录都会有一些隐藏字段,而在MVCC机制中,用处最大的就是trx_id
,roll_pointer
分别代表着操作这条记录的事务的事务ID,和回滚指针(指向当前记录行的undo log信息),倘若这条记录没有主键,还包含一个隐含的主键ID
在每一个事务开启之前,都会先从数据库中拿到一个自增的事务ID
对于undo log
很明显这就是一个日志文件,记录着insert、update、delete,我们在进行删除的时候,其实innodb引擎并没有真正的删除,其实是将一个记录的一个隐含字段修改了,让我们去搜索的时候搜索不到,所以我们可以知道在undo log中只存在两种日志,一种是insert undo log
,一种是update undo log
undo log的作用就是为了保存版本链,而前面我们说的roll_pointer
这个字段就是指向的这里
为了保证可见性,当事务发起快照读的时候,就会产生一个Read View(读视图),Read View 保存了当前事务开启时所有活跃的事务列表,或者可以理解为保存了其他事务的ID列表
Read View有几个重要属性:
而对于Read View的可见性规则: