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