5.3.3 SAGA SAGA 事务模式历史悠久,早于分布式事务概念的提出。 SAGA 起源于 1987 年普林斯顿大学的 Hector Garcaa-Molina 和 Kenneth Salem 在 ACM 发表的论文《SAGAS》[^1]。该论文提出了一种提高“长时间事务”(Long Lived Transaction)效率的方法,核心思路是将一个大事务分解为多个可以交错运行的子事务,并在每个子事务中引入补偿操作。 SAGA 最初的目的是为了避免大事务长时间占用数据库资源,后来演变为一种在分布式环境中将大事务拆分为一系列小事务的设计模式。在 SAGA 模式下,分布式事务由多个参与者构成,每个参与者需要实现相应的正向操作和逆向回滚操作,以根据具体业务场景进行补偿。
SAGA 事务模式历史悠久,早于分布式事务概念的提出。
SAGA 起源于 1987 年普林斯顿大学的 Hector Garcaa-Molina 和 Kenneth Salem 在 ACM 发表的论文《SAGAS》1。该论文提出了一种提高“长时间事务”(Long Lived Transaction)效率的方法,核心思路是将一个大事务分解为多个可以交错运行的子事务,并在每个子事务中引入补偿操作。
SAGA 最初的目的是为了避免大事务长时间占用数据库资源,后来演变为一种在分布式环境中将大事务拆分为一系列小事务的设计模式。在 SAGA 模式下,分布式事务由多个参与者构成,每个参与者需要实现相应的正向操作和逆向回滚操作,以根据具体业务场景进行补偿。
:::tip 补偿
补偿(也称逆向恢复)指的是在分布式事务出现异常时,通过一系列的操作,尽可能使得分布式事务状态回滚到之前的状态,从而避免分布式事务产生不一致的情况。
:::
SAGA 事务模型由两部分操作组成:
如果 T1 到 Tn 均执行成功,那么整个事务顺利完成,否则根据下面两种机制之一进行事务恢复。
:::center
图 5-4 SAGA 事务模型
:::
SAGA 模式非常适合处理流程较长且需要确保事务最终一致性的业务操作。例如,一个旅游预订平台上,用户可以同时预订机票、酒店和租车服务,这三项服务可能由不同的微服务或第三方供应商提供。这个场景中,SAGA 事务模型允许系统逐步执行每个操作,并在任一步骤失败时有序地进行补偿操作,从而确保系统的一致性和提升用户体验。
与 TCC 模型相比,SAGA 通常采用事件驱动设计,即每个服务都是异步执行的,无需设计资源的冻结状态或处理撤销冻结的操作。然而,这种方式也存在一些问题。比如,缺乏隔离性,当多个 SAGA 事务同时操作同一数据源时,因缺乏隔离机制,操作无法保证原子性,可能导致数据被覆盖的情况。
最后,尽管补偿操作相对容易实现,但确保正向操作和逆向回滚的严格执行也需要投入相当多的精力。因此,SAGA 事务通常不会通过裸编码来实现,而是在事务中间件的支持下完成。前面介绍 TCC 事务模型时,笔者提到的 Seata 中间件也支持 SAGA 事务模型。