vlambda博客
学习文章列表

MySQL里的undo log, MVCC以及事务隔离级别

MVCC需要使用undo log来实现,而可重复读的事务隔离级别也需要MVCC来支持.

undo log其实就是sql语句的逆操作.例如一个insert语句,对应的undo log就是delete语句.一个update语句对应的undo log是另一个将数据恢复成原样的update语句.


这里的多版本是通过一致性视图来实现的.

InnoDB里每一个事务都有一个事务ID (transaction id).在事务开始时向InnoDB的事务系统申请.

每次事务更新数据的时候,都会生成一个新的数据版本,把transaction id赋值给这个数据版本的事务ID, 记作row trx_id.

因此每行记录都可能有多个版本,每个版本有自己的row trx_id.

MVCC多版本并发控制里的多版本指的就是数据行存在多个版本.


InnoDB给每个事务创建一个数组,保存这个事务启动瞬间,所有已启动但还没提交的事务ID.

把事务A启动的时刻记为t1,则t1前已提交的事务(不在数组中)产生的数据版本,对事务A来说都是可见的.

而在t1时刻,尚未开始的事务产生的数据版本,对事务A是不可见的.


更新语句和加锁的查询,都是当前读,读取当前最新版本的值.


参考文献

极客时间专栏 - MySQL实战45讲