# 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事务模式适用于跨系统、长周期的业务流程,实施前需充分评估业务场景和技术实现成本。