spring alibaba中的seata分布式事务

2024-05-07 02:52

本文主要是介绍spring alibaba中的seata分布式事务,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Seata AT 模式设计思路

一阶段:业务数据和回滚日志记录在同一个本地事务中提交,释放本地锁和连接资源。

核心在于对业务sql进行解决解析,转换成undolog,并同时入库存

二阶段:

提交异步化,非常快速地完成,则Tc通知RM异步删除undolog;

回滚一阶段日志进行反向补偿,tm向tc发送回滚请求,RM收一协调器TC发来的回滚请求,通过XID和Branch ID找到相应的回滚日志记录,通过回滚记录生成反向的更新sql并执行,以完成分支的回滚

两阶段提交协议(2PC)

阶段1:TM(事务管理器)通知各个RM(资源管理器)准备提交它们的事务分支

阶段2:TM 根据阶段1各个RM prepare的结果,决定是提交还是回滚事务。如果所有的RM都prepare成功,那么TM通知所有的RM进行提交;如果有RM prepare失败的话,则TM通知所有RM回滚自己的事务分支。

存在的问题:

  1. 同步阻塞问题
  2. 单点故障
  3. 数据不一致

XA模式

执行阶段:

可回滚:业务SQL操作放在XA分支中进行,由资源对XA协议来保证可回滚

持久化:XA分支完成后,执行XA prepare,同样,由资源对XA协议的来支持来保证持久化

完成阶段:

分支提交:执行XA分支的commit

分支回滚:执行XA分支的rollback

TCC模式

tcc基于分布式事务中的二阶段提交协议实现,这化的全称为Try-Confirm-Cancel,即资源预留(Try)、确认操作(Confirm)、取消操作(Cancel),他们的具体含义如下:

  1. Try:对业务资源的检查并预留
  2. Confirm:对业务处理进行提交,即commit操作,只要Try成功,那么该步骤一定成功
  3. Cancel:对业务处理进行取消,即回滚操作,该步骤回对Try预留的资源进行释放。

TCC是一种侵入式的分布式事务解决方案,对业务系统有着非常大的入侵性,设计相对复杂

优点:TCC完全不依赖数据库,能够实现跨数据库、跨应用资源管理

Seata如何防止空回滚,新增一个TCC事务控制表

如何处理幂等,幂等问题指的是 TC 重复进行二阶段提交,因此 Confirm/Cancel 接口需要支持幂等处理,即不会产生资源重复提交或者重复释放。

如何处理悬挂,在 TCC 事务控制表记录状态的字段 status 中增加一个状态: 当执行二阶段 Cancel 方法时,如果发现 TCC 事务控制表没有相关记录,说明二阶段 Cancel 方法优 先一阶段 Try 方法执行,因此插入一条 status=4 状态的记录,当一阶段 Try 方法后面执行时,判断 status=4 ,则说明有二阶段 Cancel 已执行,并返回 false 以阻止一阶段 Try 方法执行成功

XA与TCC比较

  1. XA是资源层面的分布式事务,强一致性,在两阶段提交的整个过程中,一直会持有资源的锁。

  1. TCC是业务层面的分布式事务,最终一致性,不会一直持有资源的锁

AT模式与TCC模式比较

区别在于:

AT模式基于支持本地ACID事务的关系型库数据

一阶段prepare行为:在本地事务中,一并提交业务数据更新和相应回滚日志记录

二阶段commit行为:马上成功结束,自动异步批量清理回滚日志

二阶段rollback行为:通过回滚日志,自动生成补偿操作,完成数据回滚

相应用的,TCC模式不依赖于底层数据资源的事务支持:

一阶段prepare行为:调用自prepare逻辑

二阶段commit行为:调用自定义的commit逻辑

二阶段rollback行为:调用自定义的rollback逻辑。

简单点概括,SEATA的TCC模式就是手工的AT的模式,它允许你自定义两阶段的处理逻辑而不依赖AT模式的undo_log

可靠消息最终一致性

异步化在分布式系统设计中随处可见,基于消息队列的最终一致性就是一种异步事务机制,在业务中广泛应用。

本地消息表

将分布式事务拆分成本地事务进行处理,通过消息日志的方式来异步执行。本地消息表是一种业务耦合的设计,消息生产方需要额外建一个事务消息表,并记录消息发送状态,消息消费方需要处理这个消息,并完成自己的业务逻辑,另外会有一个异步机制来定期扫描未完成的消息,确保最终一致性。

RocketMQ事务消息

RocketMQ事务消息是一种支持分布式事务的消息。它通过引入prepare、commit和rollback三个阶段,来确保事务消息的一致性。

  1. Prepare阶段:消息发送方发送消息,此时消息的状态为“待提交”
  2. commit阶段:消息发送方向RocketMQ发送commit消息请求,RocketMQ判断此时半消息是否被确认,如果半消息已被确认,则将消息标记为“可消费”并提交事务。如果半消息未被确认,刚将消息标记为“不可消息”并终止事务。
  3. rollback阶段:消息发送方向rocketMQ发送rollback消息请求,RocketMQ将半消息标记为“不可消费”并回滚事务。

最大努力通知

最大努力通知型是最简单的一种柔性事务,适用于一些最终一致性时间敏感度低的业务,且被动方处理不影响主动方的处理结果。

最大努力通知实施方案,一般符合以下特点:

  1. 不可靠消息:业务活动主动方,在完成业务处理之后,向业务活动的被动方发送消息,直到通知N次后不再通知,允许消息丢失(不可靠消息)
  2. 定期校对:业务活动的被动方,根据定时策略,向业务活动主动方查询(主动方提供查询接口),恢复丢失的业务消息

这篇关于spring alibaba中的seata分布式事务的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/966121

相关文章

如何通过海康威视设备网络SDK进行Java二次开发摄像头车牌识别详解

《如何通过海康威视设备网络SDK进行Java二次开发摄像头车牌识别详解》:本文主要介绍如何通过海康威视设备网络SDK进行Java二次开发摄像头车牌识别的相关资料,描述了如何使用海康威视设备网络SD... 目录前言开发流程问题和解决方案dll库加载不到的问题老旧版本sdk不兼容的问题关键实现流程总结前言作为

SpringBoot中使用 ThreadLocal 进行多线程上下文管理及注意事项小结

《SpringBoot中使用ThreadLocal进行多线程上下文管理及注意事项小结》本文详细介绍了ThreadLocal的原理、使用场景和示例代码,并在SpringBoot中使用ThreadLo... 目录前言技术积累1.什么是 ThreadLocal2. ThreadLocal 的原理2.1 线程隔离2

springboot将lib和jar分离的操作方法

《springboot将lib和jar分离的操作方法》本文介绍了如何通过优化pom.xml配置来减小SpringBoot项目的jar包大小,主要通过使用spring-boot-maven-plugin... 遇到一个问题,就是每次maven package或者maven install后target中的ja

Java中八大包装类举例详解(通俗易懂)

《Java中八大包装类举例详解(通俗易懂)》:本文主要介绍Java中的包装类,包括它们的作用、特点、用途以及如何进行装箱和拆箱,包装类还提供了许多实用方法,如转换、获取基本类型值、比较和类型检测,... 目录一、包装类(Wrapper Class)1、简要介绍2、包装类特点3、包装类用途二、装箱和拆箱1、装

如何利用Java获取当天的开始和结束时间

《如何利用Java获取当天的开始和结束时间》:本文主要介绍如何使用Java8的LocalDate和LocalDateTime类获取指定日期的开始和结束时间,展示了如何通过这些类进行日期和时间的处... 目录前言1. Java日期时间API概述2. 获取当天的开始和结束时间代码解析运行结果3. 总结前言在J

Java深度学习库DJL实现Python的NumPy方式

《Java深度学习库DJL实现Python的NumPy方式》本文介绍了DJL库的背景和基本功能,包括NDArray的创建、数学运算、数据获取和设置等,同时,还展示了如何使用NDArray进行数据预处理... 目录1 NDArray 的背景介绍1.1 架构2 JavaDJL使用2.1 安装DJL2.2 基本操

最长公共子序列问题的深度分析与Java实现方式

《最长公共子序列问题的深度分析与Java实现方式》本文详细介绍了最长公共子序列(LCS)问题,包括其概念、暴力解法、动态规划解法,并提供了Java代码实现,暴力解法虽然简单,但在大数据处理中效率较低,... 目录最长公共子序列问题概述问题理解与示例分析暴力解法思路与示例代码动态规划解法DP 表的构建与意义动

Java多线程父线程向子线程传值问题及解决

《Java多线程父线程向子线程传值问题及解决》文章总结了5种解决父子之间数据传递困扰的解决方案,包括ThreadLocal+TaskDecorator、UserUtils、CustomTaskDeco... 目录1 背景2 ThreadLocal+TaskDecorator3 RequestContextH

关于Spring @Bean 相同加载顺序不同结果不同的问题记录

《关于Spring@Bean相同加载顺序不同结果不同的问题记录》本文主要探讨了在Spring5.1.3.RELEASE版本下,当有两个全注解类定义相同类型的Bean时,由于加载顺序不同,最终生成的... 目录问题说明测试输出1测试输出2@Bean注解的BeanDefiChina编程nition加入时机总结问题说明

java父子线程之间实现共享传递数据

《java父子线程之间实现共享传递数据》本文介绍了Java中父子线程间共享传递数据的几种方法,包括ThreadLocal变量、并发集合和内存队列或消息队列,并提醒注意并发安全问题... 目录通过 ThreadLocal 变量共享数据通过并发集合共享数据通过内存队列或消息队列共享数据注意并发安全问题总结在 J