贝利信息

SQL数据库事务回滚链路_Undo版本追溯机制

日期:2026-01-10 00:00 / 作者:舞夢輝影
事务回滚通过Undo日志的版本链实现,利用DB_TRX_ID和DB_ROLL_PTR逆向追溯旧版本;多事务下结合Read View判断可见性;Purge线程异步清理不再需要的Undo记录。

事务回滚依赖Undo日志构建的版本链,核心是通过事务ID(TRX_ID)和回滚指针(ROLL_PTR)在Undo Log中逆向追溯旧版本数据。

Undo日志如何记录数据变更

每次UPDATE或DELETE操作,InnoDB会把原数据(变更前的行记录)写入Undo Log,并在当前聚簇索引记录中添加两个隐藏字段:

这些信息共同构成“版本链”,新版本指向旧版本,形成从最新到最老的单向链表。

事务回滚时如何定位并恢复旧版本

执行ROLLBACK时,系统并不真正“删除”新数据,而是沿DB_ROLL_PTR逐级查找,还原到事务开始前的状态:

例如:事务T1修改了某行三次,对应产生三个Undo Log节点;回滚时直接沿链回到第一个Undo版本,即T1开始前的状态。

多事务并发下的版本可见性控制

Undo链本身不决定“该读哪个版本”,而是配合Read View判断可见性:

这使得不同事务即使访问同一行,也能看到各自隔离级别下正确的快照版本。

Undo Log的物理组织与清理时机

Undo Log并非无限增长,其管理由Purge线程异步完成:

因此,避免长时间运行的事务,是保障Undo链高效、可控的关键实践。