暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

PolarDB-X DN InnoDB 引擎事务管理剖析

PolarDB 2025-11-25
64

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、清理阶段:

  • 释放资源
  • 将事务返回到池中

对于不同类型的事务,处理流程有所不同:

事务类型
提交流程
只读
没有重做日志写入,只是释放资源
标准
写入重做日志、释放锁、清理
XA/分布式
带有准备阶段的两阶段提交

回滚流程

当事务回滚时,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 实现了几种类型的锁:

锁类型
描述
记录锁
锁定单个索引记录
间隙锁
锁定索引记录之间的间隙
Next-Key Lock
记录和间隙锁的组合
插入意向锁
特殊锁指示插入意图
表锁
锁定整个表
Auto-INC 锁
自增列的特殊锁

锁层次结构


死锁检测

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 支持四种具有不同保证的事务隔离级别:

隔离级别
描述
实现
读未提交
可以读取未提交的更改
无需 MVCC 的直接访问
读已提交
仅读取已提交的更改
读取每个语句上创建的事务快照视图
可重复读取
整个事务过程中可见相同的行
事务开始时创建一次读取事务快照视图
可序列化
相当于 REPEATABLE READ,但所有 SELECT 都获取锁
可重复读以及所有行上的共享锁

事务ID管理

InnoDB 使用集中计数器维护事务 ID:

小结

InnoDB 的事务管理系统通过 MVCC、锁和日志记录机制的复杂组合,提供了强大的 ACID 合规性。可以处理从简单事务到复杂的分布式 XA 事务,并通过全面的恢复系统确保即使在崩溃后也能保持数据一致性。

该系统通过 MVCC 实现实现高并发性,同时保持严格的数据隔离保证。事务系统与缓冲池、文件系统和恢复机制的集成确保了事务的持久性,并确保数据库在意外关闭后能够恢复到一致状态。

欢迎关注PolarDB公众号.

如需“商务咨询“或”开源交流“, 速加小编微信.


文章转载自PolarDB,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论