多版本并发控制(MVCC)原理

【Mysql-InnoDB 系列】事务提交过程_MySQL_程序员架构进阶_InfoQ写作社区

目录

1 mysql的日志机制

1.1 redo log(重做日志)

1.2 undo log(回滚日志)

1.3 bin log(归档日志)

2 多版本并发控制原理分析之隐式字段

2.1 DB_TRX_ID

2.2 DB_ROLL_PTR

2.3 DB_ROW_ID

3 多版本并发控制原理之当前读与快照读

3.1 当前读

3.2 快照读

4 多版本并发控制原理之读视图

4.1 读视图(read-view)

4.2 何时生成读视图

5 多版本并发控制原理之数据可见性算法 


1 mysql的日志机制

1.1 redo log(重做日志)

1、redo log是InnoDB存储引擎层的日志

2、记录的是数据修改后的值,不管事务是否提交都会记录下来

3、先写日志,再写磁盘

1.2 undo log(回滚日志)

1、保存最新事务发生之前的数据版本

2、可以用于回滚

3、同时可以提供多版本并发控制下的读(MVCC),也即非锁定读

1.3 bin log(归档日志)

1、主从复制

2、以二进制的形式记录(分为row、statement、或混合)

3、用于数据库的基于时间点的还原

4、提交事务记录binlog,定时刷盘

2 多版本并发控制原理分析之隐式字段

2.1 DB_TRX_ID

1、6byte

2、记录创建这条记录时,最后一次修改该记录的事务ID

2.2 DB_ROLL_PTR

1、7byte,回滚指针

2、指向这条记录的上一个版本(存储于rollback segment回滚段里)

2.3 DB_ROW_ID

1、6byte,隐含的自增ID(隐藏主键)

2、如果数据表没有主键 InnoDB会自动以DB_ROW_ID产生一个聚簇索引

3 多版本并发控制原理之当前读与快照读

3.1 当前读

select for update;update,insert,delete

1、读取的是记录的最新版本

2、读取时还要保证其他并发事务不能修改当前记录

3、会对读取的记录进行加锁

3.2 快照读

select

1、不加锁的非阻塞读

2、快照读的前提是隔离级别不是串行级别

3、串行级别下的快照读会退化成当前读

4 多版本并发控制原理之读视图

4.1 读视图(read-view)

怎么理解读视图:它决定了数据是否可以被其他事务之间可见,读取到的一些数据的事务情况就是存储在读视图中,读视图的组成如下:

1、List:生成read-view时所形成的活跃事务id集合

2、up limit id:list中最小的事务id

3、low limit id:下一个要分配的事务id

4.2 何时生成读视图

1、在可重复读级别下,首次快照读时生成读视图

2、在读已提交级别下,每次快照读时生成读视图

其他隔离级别,不适用MVCC,就没有读视图。

上图就是在可重复读级别下,生成的read-view。List中之所以没有事务4,是因为在事务2执行select时,事务4已经提交了。

上图就是在可重复读级别下,生成的read-view。List中之所以只有事务1、2,是因为在事务2执行第一次select时,活跃的事务只有1、2,并且会伴随着事务2一直传递下去,事务2执行第二次select时,List是没有变化的。

5 多版本并发控制原理之数据可见性算法 

上图就是数据可见性算法的逻辑图。

看下面的例子1:

 上图中,刚好满足数据可见性算法的最后一个判断:TRX_ID(最新的事务id)不小于List中的“Up I D”(1)、TRX_ID不等于当前事务id(2)、TRX_ID不大于“Low ID”、TRX_ID不在List范围中,所以当前记录对事务2是可见的。

再看下面的例子2:

再看下面的例子3:

通俗易懂的MySQL事务及MVCC原理,我先收藏了!_SunAlwaysOnline的博客-CSDN博客

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值