PolarDB-X DN InnoDB 引擎事务管理剖析
本文介绍 InnoDB 的事务管理系统,该系统通过结合多版本并发控制 (MVCC)、锁和日志记录机制来提供 ACID(原子性、一致性、隔离性、持久性)合规性。涵盖事务生命周期、隔离级别、并发控制和恢复机制。
事务结构和状态
InnoDB 事务管理的核心是trx_t
结构,它维护跟踪和管理事务状态和资源所需的所有信息。
事务结构

事务状态
InnoDB 中的事务在其生命周期中会经历几个状态:

NOT_STARTED:事务分配后的初始状态 ACTIVE:事务正在处理操作 PREPARED:XA 事务已 prepare(分布式事务) COMMITTED_IN_MEMORY:事务已提交,但清理可能正在进行中 FORCED_ROLLBACK:事务已被标记为强制回滚
事务生命周期管理
InnoDB 使用事务池来实现高效的内存管理和事务重用。事务池负责处理事务对象的分配、初始化和释放。

提交流程
提交过程涉及几个步骤:
1、准备阶段:将undo日志记录写入磁盘
2、提交阶段:
分配事务ID 在内存中将事务标记为已提交 添加到刷新列表以写入redo日志 释放锁
3、清理阶段:
释放资源 将事务返回到池中
对于不同类型的事务,处理流程有所不同:
回滚流程
当事务回滚时,InnoDB:
更改事务状态 读取undo日志以撤销事务所做的更改 释放undo日志 释放事务持有的锁 将事务返回到池中
回滚可以由用户明确启动,也可以在出现死锁或超时时由系统自动启动。
并发控制和 MVCC
InnoDB 使用多版本并发控制 (MVCC) 来实现无需锁即可同时访问数据库。实现方式是维护同一行的多个版本,并允许每个事务查看事务启动时的数据库快照。
读视图(快照信息)
读视图是事务启动时(在可重复读隔离模式
下)或语句启动时(在读已提交隔离模式
下)创建的数据库快照。它决定了哪些行的版本对事务可见。

可见性检测
1、对于每一行,InnoDB 通过以下方式确定可见性:
读取行版本的事务ID( trx_id
)将其与快照信息进行比较 如果需要,可以跟踪undo日志链来查找可见版本
2、以下情况,行版本可见:
它是由当前事务创建的,或者 它是由在创建读视图(快照信息)之前提交的事务创建的,或者 这是创建读视图(快照信息)之前的最新版本
Lizard Vision增强
PolarDB-X 通过“Lizard Vision”扩展了 InnoDB 的 MVCC,该功能在基于事务 ID 的传统方法中增加了基于 GCN/SCN(全局/系统变更号)的可见性判断。这为时间点读取提供了额外的功能,并增强了一致性读。

锁系统
InnoDB 的锁系统与 MVCC 协同工作,以提供隔离。MVCC 处理读取操作,而锁则用于写入操作,以防止发生修改冲突。
锁类型
InnoDB 实现了几种类型的锁:
锁层次结构

死锁检测
InnoDB 包含一套复杂的死锁检测机制,它会定期检查锁等待周期。一旦发现死锁,就会回滚一个事务(通常是工作量最少的事务)来打破死锁循环。

undo日志
undo日志在 InnoDB 中起到两个重要作用:
通过记录修改数据的先前状态来启用事务回滚 通过提供对旧版本行的访问来支持 MVCC
undo日志结构

undo记录类型
InnoDB 使用几种类型的undo记录来跟踪不同类型的修改:
插入undo:记录有关插入行的信息;仅用于回滚,而不是 MVCC 更新undo:记录更新行的先前状态;用于回滚和 MVCC 删除标记undo:记录有关标记为删除的行的信息 删除undo:记录有关物理删除的行的信息
清理系统
清理系统负责删除不再需要的旧版本记录:

它处理已提交事务的历史列表 对于每个undo记录,它会检查该记录是否对任何活动事务不再可见 如果记录不可见,它会删除该记录,并且如果所有记录都已被清除,则可能会删除整个undo日志
恢复机制
InnoDB 通过使用redo日志和undo日志来确保崩溃后的持久性和一致性。
恢复过程

分析阶段:扫描重做日志以识别最后一个检查点和活动事务 重做阶段:应用重做日志中可能尚未到达磁盘的已提交更改 撤消阶段:使用undo日志回滚未完成的事务
XA事务恢复
对于分布式(XA)事务,处于已prepared状态的事务需要特殊的恢复过程:
在恢复期间识别已prepared的事务 保持prepared状态 等待事务协调器指示提交或回滚 完成相应的事务
隔离级别
InnoDB 支持四种具有不同保证的事务隔离级别:
事务ID管理
InnoDB 使用集中计数器维护事务 ID:

小结
InnoDB 的事务管理系统通过 MVCC、锁和日志记录机制的复杂组合,提供了强大的 ACID 合规性。可以处理从简单事务到复杂的分布式 XA 事务,并通过全面的恢复系统确保即使在崩溃后也能保持数据一致性。
该系统通过 MVCC 实现实现高并发性,同时保持严格的数据隔离保证。事务系统与缓冲池、文件系统和恢复机制的集成确保了事务的持久性,并确保数据库在意外关闭后能够恢复到一致状态。
欢迎关注PolarDB公众号.
如需“商务咨询“或”开源交流“, 速加小编微信.





