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讲