# Saga事务与补偿

# 一、传统OA流程的事务问题

# 典型问题场景

开始 → 部长审批 → 抛入SAP → 金蝶入账 → 结束

问题表现

  • 金蝶入账失败时,流程回退到部长审批
  • 重新审批导致SAP重复写入
  • 缺乏业务数据一致性保障

# 二、BPMN2的Saga事务模型

# 2.1 前向幂等模式

执行机制

    A[部长审批] →  B[抛入SAP]
    B →  C[金蝶入账]
    C --   失败 →  D[自动重试]
    D --   成功 →  E[继续执行]
    D --   失败3次 →  F[转为异常流程]

关键特性

  • 自动重试机制(默认3次)
  • 异常流程管理界面
  • 断点续传能力

流程示例

Saga事务前向幂等流程示例图 ▲ Saga事务前向幂等流程示例图

# 2.2 补偿模式

完整示例

    Start[开始] →  A[部长审批]
    A →  B[抛入SAP]
    B →  C{金蝶入账}
    C --   成功 →  D[经理审批]
    C --   失败 →  E[补偿中间事件]
    E →  A
    B --   补偿触发 →  F[取消SAP数据]

Saga事务补偿流程示例图 ▲ Saga事务补偿流程示例图

# 三、关键差异对比

特性 传统OA流程 BPMN2 Saga事务
错误处理方式 回退到起始节点 断点重试/补偿回退
数据一致性 无法保证 前向幂等/补偿保障
事务持续时间 短事务(秒级) 长事务(可跨月)
异常管理 需人工干预 系统化监控和恢复机制

# 四、实施指南

# 4.1 前向幂等模式实施

  1. 配置重试策略:

    • 重试次数(建议3-5次)
    • 重试间隔(指数退避算法)
  2. 异常流程处理:

    • 实现RetryPolicy接口
    • 配置异常监控看板

# 4.2 补偿模式实施

补偿逻辑设计原则:

  • 业务幂等性
  • 逆向操作需完整
  • 记录补偿日志

# 五、最佳实践

  1. 事务划分原则

    • 单个Saga不宜超过5个步骤
    • 耗时操作单独作为Saga节点
  2. 补偿设计建议

    • 为每个可补偿节点设计补偿逻辑
    • 补偿操作需记录审计日志

# 六、注意事项

  1. 业务错误与系统错误

    • 补偿仅处理业务逻辑错误
    • 系统异常应通过重试机制处理
  2. 状态管理

    • 必须持久化每个Saga节点的状态
    • 建议采用状态机+事件溯源模式
  3. 性能影响

    • 长事务会占用系统资源
    • 建议设置事务超时时间

注:Saga事务模式适用于跨系统、长周期的业务流程,实施前需充分评估业务场景和技术实现成本。