4. 事务管理器:核心职责、生命周期管理与状态机模型
事务管理器(Transaction Manager)是 ControlTransaction 体系的中枢组件。它负责协调所有参与方(资源管理器、应用、恢复管理器)的行为,确保事务的原子性、一致性、隔离性和持久性。本章深入剖析事务管理器的核心职责、事务的生命周期演化以及支撑其正确运行的状态机模型。
4.1 事务管理器的核心职责
事务管理器在分布式事务与指令序列管理中承担以下五项关键职责:
| 职责 | 说明 | 关键操作 |
|---|---|---|
| 事务标识与注册 | 为每个新事务分配全局唯一的事务ID(XID),并在事务表中注册该事务的上下文信息。 | 生成XID、记录事务起始时间、关联参与者列表 |
| 指令序列编排 | 将应用提交的操作指令按事务边界组织成有序序列,确保指令在提交或回滚时按正确顺序执行。 | 指令入队、序列化、顺序校验 |
| 两阶段提交协调 | 在事务提交阶段,协调所有参与者执行两阶段提交(2PC)或优化变体(如Paxos提交),保证全局一致性。 | Prepare、Commit/Rollback、超时处理 |
| 状态持久化与恢复 | 将事务状态变更写入持久化日志(Transaction Log),在系统崩溃后通过日志重建事务状态。 | 写日志、检查点、重做/撤销 |
| 并发控制与隔离 | 与锁管理器或MVCC引擎协作,确保并发事务之间不产生脏读、不可重复读、幻读等异常。 | 锁申请/释放、版本检查、隔离级别实施 |
职责聚焦: 事务管理器的核心在于“协调”而非“执行”。它不直接操作数据,而是通过指令序列和状态机驱动各组件协同工作。
4.2 事务生命周期管理
一个事务从创建到结束经历多个阶段,事务管理器负责在每个阶段执行对应的管理动作。下图展示了事务的完整生命周期:
4.3 状态机模型
事务管理器内部维护一个严格的状态机,确保事务状态转换的合法性和可追溯性。状态机模型是事务正确性的数学基础,它定义了哪些状态转换是允许的,哪些是禁止的。
4.3.1 状态定义
| 状态 | 编码 | 含义 | 可执行操作 |
|---|---|---|---|
| BEGIN | 0x01 | 事务已创建,尚未执行任何指令 | 注册参与者、分配XID |
| ACTIVE | 0x02 | 事务正在执行指令序列,可追加新指令 | 追加指令、读取数据、写入数据 |
| PREPARE | 0x03 | 事务进入预提交阶段,等待所有参与者确认 | 发送Prepare请求、收集投票 |
| COMMIT | 0x04 | 事务已提交,所有变更持久化 | 写Commit日志、释放资源 |
| ROLLBACK | 0x05 | 事务已回滚,所有变更撤销 | 写Rollback日志、撤销指令 |
| END | 0x06 | 事务生命周期结束,清理上下文 | 释放XID、清理事务表 |
4.3.2 状态转换规则
状态机模型定义了以下合法转换路径,任何非法转换都会被事务管理器拒绝并触发异常:
- BEGIN → ACTIVE:事务初始化完成后立即进入活动状态。
- ACTIVE → ACTIVE:允许在活动状态内持续追加指令(自循环)。
- ACTIVE → PREPARE:应用发起提交请求时,事务管理器将状态切换为预提交。
- ACTIVE → ROLLBACK:应用发起回滚请求或发生错误时,直接进入回滚状态。
- PREPARE → COMMIT:所有参与者投票通过(Yes),进入提交状态。
- PREPARE → ROLLBACK:任一参与者投票否决(No)或超时,进入回滚状态。
- COMMIT → END:提交日志写入完成后,进入结束状态。
- ROLLBACK → END:回滚操作完成后,进入结束状态。
状态转换约束: 不允许从 COMMIT 或 ROLLBACK 直接跳转到 ACTIVE 或 PREPARE。一旦事务进入终态(COMMIT/ROLLBACK),其状态不可逆转。这是保证事务原子性的关键。
4.3.3 状态机模型图
4.4 事务管理器内部架构
事务管理器的内部架构通常由以下模块组成,各模块协同完成上述职责:
4.5 关键实现要点
实现提示: 事务管理器的状态机应使用 有限状态机(FSM) 模式实现,避免使用 if-else 链。推荐使用状态表驱动或状态模式(State Pattern),便于扩展和维护。
以下是一个简化的状态机核心代码示例,展示如何用状态表驱动事务状态转换:
// 状态转换表:state_transition[当前状态][事件] = 下一状态
// 非法转换返回 -1
int state_transition[6][4] = {
// 事件: BEGIN_READY, COMMIT_REQ, ROLLBACK_REQ, VOTE_DECISION
{ ACTIVE, -1, -1, -1 }, // BEGIN
{ -1, PREPARE, ROLLBACK, -1 }, // ACTIVE
{ -1, -1, ROLLBACK, COMMIT }, // PREPARE
{ -1, -1, -1, -1 }, // COMMIT (终态)
{ -1, -1, -1, -1 }, // ROLLBACK (终态)
{ -1, -1, -1, -1 } // END (终态)
};
int next_state = state_transition[current_state][event];
if (next_state == -1) {
// 抛出非法状态转换异常
throw IllegalStateTransitionException(current_state, event);
}
// 执行状态切换
current_state = next_state;
4.6 事务管理器与指令序列的交互
事务管理器与指令序列管理器的交互遵循以下协议:
- 指令追加:在 ACTIVE 状态下,应用每提交一条指令,事务管理器将其追加到当前事务的指令序列尾部。
- 序列冻结:当状态切换到 PREPARE 时,指令序列管理器冻结当前序列,禁止追加新指令。
- 序列提交:在 COMMIT 状态下,指令序列管理器将序列标记为“已提交”,并通知资源管理器执行持久化。
- 序列回滚:在 ROLLBACK 状态下,指令序列管理器逆向遍历序列,逐条执行撤销操作。
关键设计原则: 指令序列的提交和回滚操作必须是幂等的。事务管理器在崩溃恢复时可能重放这些操作,幂等性保证即使重复执行也不会破坏数据一致性。
4.7 本章小结
事务管理器是 ControlTransaction 体系的核心协调者,其核心职责涵盖事务标识、指令编排、两阶段提交协调、状态持久化与并发控制。事务生命周期从 BEGIN 到 END 经历 ACTIVE、PREPARE、COMMIT/ROLLBACK 等关键阶段,每个阶段由严格的状态机模型驱动。状态机模型确保了状态转换的合法性和可追溯性,是事务原子性和一致性的数学基础。事务管理器内部的状态机引擎、指令序列管理器、两阶段提交协调器和日志恢复模块协同工作,共同支撑起分布式事务的正确执行。