saga模式、Seata saga模式详解

本文深入介绍了SAGA模式,包括其起源、组成、执行场景、协调方式以及Seata中SAGA模式的实现。SAGA模式通过将长事务分解为一系列本地事务和补偿操作,解决了长事务带来的资源占用问题。Seata的SAGA模式采用编排策略,利用状态机来驱动业务流程。同时,文章也探讨了SAGA模式的缺陷,如空补偿、悬挂、幂等性问题和脏读问题,并提出了相应的解决方案。

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

### 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"} ] ```
评论 58
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

秃秃爱健身

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值