SAGA 事务¶
重要
基于数据补偿代替回滚的解决思路
SAGA 事务模式:
一种提升 “长时间事务”(Long Lived Transaction)运作效率的方法
大致思路是把一个大事务分解为可以交错运行的一系列子事务的集合。
原本提出 SAGA 的目的,是为了避免大事务长时间锁定数据库的资源,
后来才逐渐发展成将一个分布式环境中的大事务,分解为一系列本地事务的设计模式。
SAGA 由两部分操作组成:
1. 把大事务拆分成若干个小事务,将整个分布式事务 T 分解为 n 个子事务,我们命名为 T1,T2,…,Ti,…,Tn
每个子事务都应该、或者能被看作是原子行为。
如果分布式事务 T 能够正常提交,那么它对数据的影响(最终一致性)就应该与连续按顺序成功提交子事务 Ti 等价
2. 为每一个子事务设计对应的补偿动作,我们命名为 C1,C2,…,Ci,…,Cn
Ti 与 Ci 必须满足以下条件:
1. Ti 与 Ci 都具备幂等性;
2. Ti 与 Ci 满足交换律(Commutative)
3. Ci 必须能成功提交
即不考虑 Ci 本身提交失败被回滚的情况,如果出现就必须持续重试直至成功,或者要人工介入
备注
如果 T1 到 Tn 均成功提交,那么事务就可以顺利完成。否则,我们就要采取以下两种恢复策略之一
恢复策略:
1. 正向恢复(Forward Recovery)
如果 Ti 事务提交失败,则一直对 Ti 进行重试,直至成功为止(最大努力交付)
这种恢复方式不需要补偿,适用于事务最终都要成功的场景,比如:
在别人的银行账号中扣了款,就一定要给别人发货。
正向恢复的执行模式为:T1,T2,…,Ti(失败),Ti(重试)…,Ti+1,…,Tn
2. 反向恢复(Backward Recovery)
如果 Ti 事务提交失败,则一直执行 Ci 对 Ti 进行补偿,直至成功为止(最大努力交付)
这里要求 Ci 必须(在持续重试后)执行成功。
反向恢复的执行模式为:T1,T2,…,Ti(失败),Ci(补偿),…,C2,C1