Saga 只实现了数据库中 ACID 中的 ACD:
4.3.1 缺乏隔离导致的问题
三种异常:
注意脏读和不可重复读的区别.
丢失更新
场景:
脏读
场景:
4.3.2 Saga 模式下实现隔离的对策
论文中的对策:
Saga 的结构
三种类型的事务:
对策: 语义锁
每个 Saga 都会有状态, 开始时可能时 APPROVAL_PENDING, Saga 的最后一步会将状态更改为 APPROVED, 如果发生回滚, 补偿事务将状态更新为 REJECTED.
对策: 交换式更新
如果更新操作式可以按任何顺序执行, 则操作式可交换的 (commutative).
对策: 悲观视图
Pessimistic View, 重新排序 Saga 的步骤, 以最大限度地降低由于脏读而导致地业务风险.
对策: 重读值
对策: 版本文件
记录对数据执行地操作, 以便可以对它们进行重新排序.
对策: 业务风险评级
根据风险来决定使用 Saga 活分布式事务.
这些对策完全看不懂在干啥.