抽象类 abstractdtxparticipant 固化分布式事务预提交与回滚流程,封装状态管理、幂等防护和上下文传递,强制子类实现 doprepare() 和 dorollback() 资源操作钩子。

在 Java 抽象类中定义分布式事务参与者的通用预提交(prepare)与回滚(rollback)骨架,核心是**将协议流程固化、将具体资源操作延迟到子类实现**。抽象类负责统一协调生命周期、状态校验、异常处理和日志记录,而子类只需专注自身资源的 prepare/rollback 逻辑。
定义抽象参与者骨架
创建抽象类 AbstractDtxParticipant,声明为 abstract,并封装分布式事务中参与者共有的行为:
- 持有事务唯一标识(如
xid)、本地资源引用(如数据库连接、消息队列客户端)等上下文 - 用
enum定义内部状态(INIT,PREPARED,COMMITTED,ROLLED_BACK),避免非法状态跃迁 - 提供
prepare()和rollback()模板方法:校验前置条件 → 调用抽象钩子 → 更新状态 → 返回结果
模板方法中预留抽象钩子
在 prepare() 和 rollback() 中调用受保护的抽象方法,强制子类实现资源级操作:
-
protected abstract boolean doPrepare();—— 如执行 SQL 的savepoint+ 预占库存、发送半消息、写入预提交日志等 -
protected abstract void doRollback();—— 如释放锁、撤回半消息、清理临时状态 - 钩子方法不暴露事务上下文细节,仅返回成功与否或抛出明确异常(如
DtxPrepareException)
内置幂等与状态防护
抽象类自动保障重复调用的安全性:
-
prepare()先检查是否已PREPARED或COMMITTED,若是则直接返回true(幂等) -
rollback()若状态已是ROLLED_BACK,也直接返回(避免重复清理) - 所有状态变更加
synchronized(this)或使用AtomicInteger状态机,防止并发调用冲突
支持可插拔的事务上下文传递
不硬编码事务管理器类型,而是通过构造函数注入或模板参数接收上下文:
- 例如接受
TransactionContext接口,含getXid()、getTimeout()等只读信息 - 子类可据此选择是否启用超时中断、是否记录 traceId 到日志
- 抽象类本身不发起远程调用或注册协调者,保持“被动参与者”语义
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











