针对 DB1(本地数据库操作1)、DB2(本地数据库操作2)、ES1(外部系统请求1)、ES2(外部系统请求2)四个原子步骤,进行顺序组合和事务一致性分析,主要分析维度:
- 执行顺序:4! = 24 种理论顺序,实际常见为串行、分组、交错等。
- 依赖关系:后续步骤是否依赖前置步骤的结果。
- 异常回滚:某一步失败时,前面已完成的步骤是否需要回滚。
- 补偿机制:无法回滚时,是否需要补偿(如外部系统幂等/反向操作)。
以下是将“DB1、DB2、ES1、ES2”四步的顺序、依赖、异常回滚、补偿等内容整合后的详细矩阵表格,便于一目了然地分析每种典型场景下每一步的处理方式:
场景 | 步骤顺序 | 依赖关系说明 | 每步异常处理 | 回滚/补偿策略说明 | 适用场景/备注 |
---|---|---|---|---|---|
1 | DB1→DB2→ES1→ES2 | DB2依赖DB1,ES1/ES2依赖DB2 | DB1/DB2异常:本地事务回滚,流程终止 ES1/ES2异常:记录异常,触发补偿(如重试/人工/反向) | 本地可回滚,外部需补偿 | 本地先写库,后异步外部,最终一致性 |
2 | DB1→ES1→DB2→ES2 | DB2依赖ES1 | DB1异常:回滚,终止 ES1异常:回滚DB1,终止 DB2异常:回滚DB1/ES1,或补偿ES1 ES2异常:补偿ES1/DB1/DB2 | 步步依赖,需分布式事务或补偿 | 依赖链较长,复杂度高 |
3 | ES1→DB1→DB2→ES2 | DB1依赖ES1 | ES1异常:终止 DB1/DB2异常:回滚本地,补偿ES1 ES2异常:补偿ES1/DB1/DB2 | 外部先决,后本地,需幂等外部接口 | 适合外部接口幂等 |
4 | ES1→ES2→DB1→DB2 | DB1依赖ES2 | ES1/ES2异常:终止 DB1/DB2异常:回滚本地,补偿ES1/ES2 | 外部全部成功再本地,强一致性 | 强一致性场景 |
5 | DB1→ES1→ES2→DB2 | ES2依赖ES1,DB2依赖ES2 | DB1异常:回滚,终止 ES1异常:回滚DB1,终止 ES2异常:回滚DB1/ES1,或补偿ES1 DB2异常:回滚前置或补偿 | 串行依赖链,分布式事务复杂 | 依赖链长,需分布式事务 |
6 | DB1→DB2→ES1→ES2 | 无依赖 | 任一步异常:不回滚,记录异常,后续补偿或人工处理 | 各步骤独立,易实现最终一致性 | 推荐,易落地 |
7 | ES1→DB1→ES2→DB2 | DB1依赖ES1,DB2依赖ES2 | ES1异常:终止 DB1异常:补偿ES1,终止 ES2异常:补偿ES1/DB1,终止 DB2异常:补偿前置 | 串行强依赖,需分布式事务 | 强一致性,复杂度高 |
8 | DB1→ES1→DB2→ES2 | DB2依赖DB1,ES2依赖DB2 | DB1异常:回滚,终止 ES1异常:回滚DB1,终止 DB2异常:回滚DB1/ES1,或补偿ES1 ES2异常:补偿前置 | 依赖链,需分布式事务 | 复杂依赖链 |
说明:
- “本地可回滚”指DB1/DB2可用本地事务回滚;“外部需补偿”指ES1/ES2需幂等或反向操作。
- “补偿”包括重试、反向接口、人工处理等。
- 依赖链越长,强一致性需求越高,实现越复杂,需分布式事务或补偿机制。
- 实际开发建议优先采用“本地操作先完成,外部异步补偿”模式(如场景1、6),降低一致性复杂度。