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

Posted dejavuyj

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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讲

以上是关于MySQL里的undo log, MVCC以及事务隔离级别的主要内容,如果未能解决你的问题,请参考以下文章

预告 | 浅谈MySQL事务之MVCCUndoRedo By董红禹

MySQL事务并发问题和MVCC机制

MySql Undo Redo

三招搞挂Mysql(转)

MySQL事务日志 undo log 详解

事务的实现原理