Saga 只实现了数据库中 ACID 中的 ACD:

image.png

4.3.1 缺乏隔离导致的问题

三种异常:

image.png

注意脏读和不可重复读的区别.

丢失更新

场景:

image.png

脏读

场景:

image.png

4.3.2 Saga 模式下实现隔离的对策

论文中的对策:

image.png

Saga 的结构

三种类型的事务:

image.png

image.png

对策: 语义锁

image.png

每个 Saga 都会有状态, 开始时可能时 APPROVAL_PENDING, Saga 的最后一步会将状态更改为 APPROVED, 如果发生回滚, 补偿事务将状态更新为 REJECTED.

对策: 交换式更新

如果更新操作式可以按任何顺序执行, 则操作式可交换的 (commutative).

对策: 悲观视图

Pessimistic View, 重新排序 Saga 的步骤, 以最大限度地降低由于脏读而导致地业务风险.

对策: 重读值

image.png

对策: 版本文件

记录对数据执行地操作, 以便可以对它们进行重新排序.

对策: 业务风险评级

根据风险来决定使用 Saga 活分布式事务.

这些对策完全看不懂在干啥.