Seata 提供了多种解决方案来解决分布式事务一致性问题 。其中包括 XA 模式、TCC 模式和 SAGA 模式等 。
- XA 模式是一种基于数据库的事务管理模式,Seata 通过与数据库进行交互来实现分布式事务的一致性 。该模式适用于对数据一致性要求比较高的业务场景,如金融、电商等 。但是,由于需要与数据库进行交互,因此该模式的性能相对较低;
- AT模式(基于应用层的两阶段提交方式):AT模式实现在应用程序中嵌入事务语义 , 通过协调维护必要的锁,实现多个业务节点之间跨多个数据库表的事务 。适用于关系型数据库的应用场景,如电商下单等 。
- TCC 模式是一种基于补偿的事务管理模式 , Seata 通过预留资源、尝试执行、确认执行和回滚执行四个阶段来实现分布式事务的一致性 。该模式适用于对性能要求比较高的业务场景,如游戏、社交等 。但是,由于需要进行多次异步通信,因此该模式的复杂度较高;
- SAGA 模式是一种基于事件驱动的事务管理模式,Seata 通过将一个大的分布式事务拆分成多个小的本地事务,并通过异步消息传递来实现分布式事务的一致性 。该模式适用于对性能和可用性要求比较高的业务场景 , 如微服务架构下的系统 。但是,由于需要进行多次异步通信和状态管理,因此该模式的复杂度也较高 。
【注】感兴趣的话,可以找下 seata 的官方文档 。
3.2.2. Context + RollbackSeata 虽好,但中间件的引入将大幅提升系统的复杂性,对于一些不太严谨的场景或者一些运维能力不足的小团队可以自己实现回滚方案 。
整体方案如下:
文章插图
图片
- 创建一个 Context 对象,用于保存整个流程的上下文数据 。其中存在一个 List<RollbackEntry> 属性 , 维护待回滚任务列表;
- 每操作完一个正向流程,向 Context 中注册一个逆向回调,及 Rollback 任务;
- 如果
关键事务提交失败,调用 Context 的 fireFallback 方法进行逆向补偿,fireFallback 方法逆向调用注册的回滚方法 , 从而恢复业务状态
该方案基于内存实现 , 存在失灵的情况,不建议使用在严谨的场景 。
3.3. 可重试性事务可重试型事务指在业务操作中,如果某些操作由于网络波动等原因导致失败,可以通过重新执行这些操作来达到其预期的结果,例如在发送短信验证码时,由于网络状况不佳而发送失败,可以重新尝试发送,直到发送成功为止 。
可重试性事务没有失败,只有成功,哪怕是短暂的失败也会通过不限的重试使其最终达到成功状态 。
3.3.1. @Retry@Retry 是 Spring 框架提供的一个注解,用于在方法调用失败时自动进行重试 。
通过 @Retry 注解,我们可以定义重试的次数、间隔时间和异常类型等信息,从而实现更可靠的方法调用 。
具体来说 , @Retry 注解可以通过以下属性来配置:
- maxAttempts:最大重试次数;
- value:重试间隔时间的数值表示;
- fixedDelay:是否固定等待重试间隔时间后再进行下一次尝试;
- backoffPolicy:重试间隔时间的退避策略;
- allowCoreThreadTimeOut:是否允许在核心线程上进行超时等待;
- excludeExceptions:需要排除的异常类型;
- excludeClassNames:需要排除的类名列表;
- loggerMessage:日志输出格式;
- fallbackMethodName:当所有重试都失败后,执行的方法名称;
- 基于计数器的重试实现
推荐阅读
- 当44岁的胡杏儿和张雨绮娜然同框,才彻底明白,港女的保养真绝
- 疯马秀“审判”后续:张嘉倪,杨颖或遭软封杀,Lisa彻底凉凉!
- 首位90后女主播登《新闻联播》,看完她的履历后,我彻底服了!
- 谢贤公开与张柏芝关系,遮羞布彻底被揭,谢霆锋得知后连忙澄清
- 安卓怎么彻底删除微信聊天记录 怎么彻底删除微信聊天记录
- 终于处罚了!Lisa被封号,杨颖张嘉倪被禁言,星光之路彻底是凉凉了
- 一个“假向太”,彻底揭开了向家的豪门真相,难怪郭碧婷会退圈!
- Lisa风波迎来大结局,3女星彻底沦为弃子,LV3公子成唯一聪明人
- 家里有老鼠怎么能彻底消灭 老鼠对粘鼠板有记忆吗
- baby彻底凉凉?被曝向黄晓明求救,准备跑路出国抛售5亿豪宅?