Java分布式事务中Participant接口定义prepare/commit/rollback三方法作为2PC契约,抽象基类固化执行流程并注入XID、超时等通用能力,辅以注解与编译/运行期校验确保语义对齐。

Java 接口本身不能强制实现逻辑,但可以在分布式事务组件中作为统一的操作契约载体——关键在于用接口定义协议必需的、不可省略的行为边界,并配合抽象基类与模板方法来约束执行流程。
定义 Participant 接口:只暴露 prepare/commit/rollback 三个核心方法
这是最直接的契约表达方式。接口应精简、无默认实现、不带业务语义:
- prepare():返回 boolean,表示本地是否已预占资源、写入日志、完成一致性检查;不允许抛异常代替“否决”,必须显式返回 false
- commit():无返回值,仅在全局决定提交后调用;要求幂等,重复调用不应报错或产生副作用
- rollback():无返回值,仅在全局决定回滚后调用;必须基于 prepare 阶段落盘的状态执行,不能依赖内存临时变量
- 禁止添加 execute()、forceCommit()、tryCommit() 等破坏 2PC 语义的扩展方法
用抽象基类封装协议骨架,把接口实现绑定到生命周期约束
单纯接口无法防止子类绕过协议。需配套抽象类(如 AbstractParticipant)来固化行为逻辑:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 该类实现 Participant 接口,但将 prepare/commit/rollback 声明为 abstract,强制子类覆盖
- 提供 final 的 execute() 方法,内部按序调用:prepare() → 上报结果 → 等待协调者指令 → commit() 或 rollback()
- 在抽象类中注入通用能力:唯一 XID 绑定、超时计时器、日志 trace ID 透传、状态机校验(如禁止 commit 未 prepare 的实例)
结合注解与编译/运行期校验,强化契约落地
光靠代码结构还不够,需多层防护确保参与者不越界:
立即学习“Java免费学习笔记(深入)”;
- 定义 @TwoPhaseCapable 注解,标注在实现类上,配合 SPI 扫描自动注册,避免手动拼接类名出错
- 使用注解处理器(APT)在编译期检查:是否同时实现了全部三个抽象方法;是否有非 protected 构造器;是否意外重写了模板方法
- 运行时通过代理或字节码增强(如 Byte Buddy)拦截非法调用:例如检测到 commit() 被外部直接调用,立即抛出 IllegalStateException
对接底层资源时保持语义对齐,不引入隐式分支
不同资源(JDBC、Kafka、Redis)实现同一接口时,必须收敛到标准 2PC 行为:
- JDBC 参与者:prepare 对应 xa_prepare,commit 对应 xa_commit,rollback 对应 xa_rollback
- Kafka 参与者:prepare 写入事务标记消息 + 暂存 offset,commit 发送 CommitMarker 并提交 offset,rollback 清理标记并重置 offset
- 自定义资源(如文件系统):prepare 创建 .tmp 文件并写 checksum,commit 重命名为正式名并删除临时文件,rollback 删除 .tmp 文件
- 所有实现都不得在 prepare 中真正落库、在 commit 中重新查状态、或在 rollback 中忽略 prepare 日志

















