# Saga事务与补偿
# 一、 传统OA流程的事务问题
# 典型问题场景
开始 → 部长审批 → 抛入SAP → 金蝶入账 → 结束
问题表现:
- 金蝶入账失败时,流程回退到部长审批。
- 重新审批导致SAP重复写入。
- 缺乏业务数据一致性保障。
# 二、 BPMN2的Saga事务模型
# 前向幂等模式
执行机制:
A[部长审批] → B[抛入SAP]
B → C[金蝶入账]
C -- 失败 → D[自动重试]
D -- 成功 → E[继续执行]
D -- 失败3次 → F[转为异常流程]
关键特性:
- 自动重试机制(默认3次)。
- 异常流程管理界面。
- 断点续传能力。
流程示例:
▲ Saga事务前向幂等流程示例图
# 补偿模式
完整示例:
Start[开始] → A[部长审批]
A → B[抛入SAP]
B → C{金蝶入账}
C -- 成功 → D[经理审批]
C -- 失败 → E[补偿中间事件]
E → A
B -- 补偿触发 → F[取消SAP数据]
▲ Saga事务补偿流程示例图
# 三、 关键差异对比
| 特性 | 传统OA流程 | BPMN2 Saga事务 |
|---|---|---|
| 错误处理方式 | 回退到起始节点 | 断点重试/补偿回退 |
| 数据一致性 | 无法保证 | 前向幂等/补偿保障 |
| 事务持续时间 | 短事务(秒级) | 长事务(可跨月) |
| 异常管理 | 需人工干预 | 系统化监控和恢复机制 |
# 四、 实施指南
# 前向幂等模式实施
配置重试策略:
- 重试次数(建议3-5次)。
- 重试间隔(指数退避算法)。
异常流程处理:
- 实现
RetryPolicy接口。 - 配置异常监控看板。
- 实现
# 补偿模式实施
补偿逻辑设计原则:
- 业务幂等性。
- 逆向操作需完整。
- 记录补偿日志。
# 五、 最佳实践
事务划分原则:
- 单个Saga不宜超过5个步骤。
- 耗时操作单独作为Saga节点。
补偿设计建议:
- 为每个可补偿节点设计补偿逻辑。
- 补偿操作需记录审计日志。
# 六、 注意事项
业务错误与系统错误:
- 补偿仅处理业务逻辑错误。
- 系统异常应通过重试机制处理。
状态管理:
- 必须持久化每个Saga节点的状态。
- 建议采用
状态机+事件溯源模式。
性能影响:
- 长事务会占用系统资源。
- 建议设置事务超时时间。
注:Saga事务模式适用于跨系统、长周期的业务流程,实施前需充分评估业务场景和技术实现成本。