【Mysql-InnoDB 系列】事务提交过程_MySQL_程序员架构进阶_InfoQ写作社区
目录
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: