Seata事务模式之Saga模式

Saga模式是Seata提供的长事务解决方案,业务流程中各参与者提交本地事务,失败则补偿已成功的参与者。适用于业务流程长且多、无法提供TCC模式接口的场景。具有高性能、高吞吐、补偿服务易实现等优势,但不保证隔离性。Seata基于状态机引擎实现该模式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

概述

         Saga模式是Seata提供的长事务解决方案,在Saga模式中,业务流程中每个参与者都提交本地事务,当出现某一个参与者失败则补偿前面已经成功的参与者,一阶段正向服务和二阶段补偿服务都由业务开发实现。

         Saga模式示意图

          理论基础:Hector & Kenneth发表论文Sagas(1987)

适用场景

  • 业务流程长、业务流程多
  • 参与者包含其它公司或遗留系统服务,无法提供TCC模式要求的三个接口

优势

  • 一阶段提交本地事务,无锁,高性能
  • 事件驱动架构,参与者可异步执行,高吞吐
  • 补偿服务易于实现

缺点

  • 不保证隔离性

Saga模式实现

       基于状态机引擎的Saga实现:

       目前Seata提供的Saga模式是基于状态机引擎来实现的,机制是:

              1)通过状态图来定义服务调用的流程并生成json状态语言定义文件;

              2)状态图中一个节点可以是调用一个服务,节点可以配置它的补偿节点;

              3)状态图json由状态机引擎驱动执行,当出现异常时状态引擎反向执行已成功节点对应的补偿节点将事务回滚;

                    注意:异常发生时是否进行补偿也可由用户自定义决定。

              4)可以实现服务编排需求,支持单项选择、并发、子流程、参数转换、参数映射、服务执行状态判断、异常捕获等功能。       

        示例状态图:

        示例状态图

 

### Seata 分布式事务模式详解 #### AT 模式 AT 模式是一种基于关系型数据库的分布式事务解决方案,在该模式下,Seata 能够自动解析 SQL 语句并记录执行前后数据的变化情况。当全局事务提交时,如果所有的分支事务都成功,则向各参与方发送 commit 请求;反之则发出 rollback 请求来撤销所有已做的变更[^1]。 对于开发者而言,使用此方式无需额外编写补偿逻辑代码,因为框架本身已经处理好了两阶段提交协议中的准备工作和最终决策过程。这使得应用程序可以像操作本地资源一样简单地调用远程服务接口而不用担心复杂的事务管理问题[^2]。 ```sql -- 正常情况下插入一条新纪录 INSERT INTO t_order (user_id, product_name) VALUES ('u001', 'book'); -- 如果发生异常,SEATA会自动生成对应的反向SQL用于回滚操作 DELETE FROM t_order WHERE user_id='u001' AND product_name='book'; ``` #### TCC 模式 TCC 是 Try-Confirm-Cancel 的缩写形式,它要求业务层提供三个方法:Try 方法负责预留必要的资源;Confirm 方法确认这些预占资源的有效性并将它们真正投入使用;Cancel 方法则是用来释放之前尝试锁定却没有被正式采用过的那些资源。这种方式给予程序员更大的灵活性去定义具体的业务规则,并且能够更好地适应不同类型的存储引擎或第三方组件集成需求。 ```java public interface OrderService { void tryCreateOrder(String userId, String productName); void confirmCreateOrder(String userId, String productName); void cancelCreateOrder(String userId, String productName); } ``` #### Saga 模式 Saga 模式的本质是一个长流程分解成若干个小步骤组成的编排方案,其中每一个环节都可以看作是一次单独的服务调用。为了保证整个链条上的动作都能顺利完成或者及时终止,每一步都需要配套相应的逆向恢复机制——即所谓的“正向活动”对应着它的“补偿活动”。一旦某个中间节点出现问题无法继续前进下去的时候,就按照相反顺序依次触发前面各个阶段设置好的补救措施直到回到最初状态为止[^3]。 ```json [ {"action": "createUser", "compensation": "deleteUser"}, {"action": "addPointsToUserAccount", "compensation": "deductPointsFromUserAccount"} ] ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值