Seata 四种事务模式
Seata 是一款开源的分布式事务解决方案,致力于提供高性能和简单易用的分布式事务服务。Seata 将为用户提供了 AT、TCC、SAGA 和 XA 事务模式,为用户打造一站式的分布式解决方案。 全文参考文献:中文文档
TC (Transaction Coordinator) - 事务协调者
维护全局和分支事务的状态,驱动全局事务提交或回滚。
TM (Transaction Manager) - 事务管理器
定义全局事务的范围:开始全局事务、提交或回滚全局事务。
RM (Resource Manager) - 资源管理器
管理分支事务处理的资源,与TC交谈以注册分支事务和报告分支事务的状态,并驱动分支事务提交或回滚。
1.AT (Auto Transaction) 常用】
AT模式是无侵入的分布式事务解决方案,适用于不希望对业务进行改造的场景,几乎0学习成本。
AT模式支持的数据库有:MySQL、Oracle、PostgreSQL、 TiDB、MariaDB。
1.1 使用前提
基于支持本地 ACID 事务的关系型数据库。
Java 应用,通过 JDBC 访问数据库。
1.2 原理机制
一阶段:
业务数据和回滚日志记录在同一个本地事务中提交,释放本地锁和连接资源。
二阶段:
提交异步化,非常快速地完成。
回滚通过一阶段的回滚日志进行反向补偿。
1.3 写隔离
一阶段本地事务提交前,需要确保先拿到全局锁 。拿不到全局锁 ,不能提交本地事务。拿全局锁的尝试被限制在一定范围内,超出范围将放弃,并回滚本地事务,释放本地锁。
1.4 读隔离
在数据库本地事务隔离级别读已提交(Read Committed)或以上的基础上,Seata(AT 模式)的默认全局隔离级别是读未提交(Read Uncommitted) 。
1.5 详细执行流程
一阶段
1)解析SQL(得到SQL的类型,表,条件等相关的信息)。
2)查询前镜像(根据解析得到的条件信息,生成查询语句,定位数据)。
3)得到前镜像(业务数据的更新前数据)。
4)执行业务SQL(执行sql)。
5)查询后镜像(根据解析得到的条件信息,生成查询语句,定位数据)。
6)得到后镜像(业务数据的更新后数据)。
7)插入回滚日志(把前后镜像数据以及业务 SQL 相关的信息组成一条回滚日志记录,插入到 UNDO_LOG 表中)。
8)提交前,向TC注册分支:申请全局锁 。
9)本地事务提交(业务数据的更新和前面步骤中生成的 UNDO LOG 一并提交)。
10)将本地事务提交的结果上报给 TC。
二阶段-回滚
收到 TC 的分支回滚请求,开启一个本地事务,执行如下操作。
1)通过 XID 和 Branch ID 查找到相应的 UNDO LOG 记录。
2)数据校验(拿 UNDO LOG 中的后镜与当前数据进行比较,如果有不同,说明数据被当前全局事务之外的动作做了修改。这种情况,需要根据配置策略来做处理)。
3)根据UNDO LOG中的前镜像和业务SQL的相关信息生成并执行回滚的语句。
4)提交本地事务。并把本地事务的执行结果(即分支事务回滚的结果)上报给 TC。
二阶段-提交
收到 TC 的分支提交请求,把请求放入一个异步任务的队列中,马上返回提交成功的结果给 TC。
1)异步任务阶段的分支提交请求将异步和批量地删除相应 UNDO LOG 记录。
1.6 优缺点
优点:
一阶段完成后提交事务,快速释放资源,性能比较好。
利用全局锁实现读写隔离。
实现简单,对业务代码零入侵。
缺点:
两阶段期间属于弱一致阶段,最终一致。
由于增加快照写入,影响效率(整体强于XA)。
依赖数据库。
1.7 Demo
详细代码参考:Springboot 集成 Seata-CSDN博客
代码使用上与XA模式相同只需调整配置的的模式就可以。
seata:data-source-proxy-mode: AT # 开启AT事务
2.TCC(Try、Confirm、Cancel)
TCC 模式是高性能分布式事务解决方案,适用于核心系统等对性能有很高要求的场景。
TCC 模式是指支持把 自定义 的分支事务纳入到全局事务的管理中【强代码入侵】。
TCC模式不依赖数据源(1.4.2及之前),1.4.2版本之后增加了TCC防悬挂措施,需要数据源支持。

2.1 原理机制
一阶段 prepare 行为
二阶段 commit 或 rollback 行为
2.2 详细执行流程
一阶段 prepare 行为:调用自定义的 prepare 逻辑。
二阶段 commit 行为:调用自定义的 commit 逻辑。
二阶段 rollback 行为:调用自定义的 rollback 逻辑。
2.3 优缺点
优点:
一阶段完成后提交事务,快速释放资源,性能比较好。
无需要快照、无需全局锁,性能好。
不依赖数据库(本人使用1.3.0不需要,1.4.2之后需要),使用补偿机制。
缺点:
强代码入侵,需要手动写try confirm cancel。
软状态,最终一致。
需要考虑失败尝试,同时要处理好幂等等问题。
2.4 Demo
详细代码参考:Springboot 集成 Seata-CSDN博客
@LocalTCC //1.开启TCC事务
@TwoPhaseBusinessAction // 2.标记TCC模式,注解在try接口上,并且声明confirm、cancel接口
订单服务代码调整
@RestController
@RequestMapping("/orderTbl")
public class OrderTblController {@Resourceprivate OrderTblService orderTblService;@Resourceprivate OrderService orderService;@PostMapping("/add/{userId}/{money}")public CxResult<Boolean> add(@PathVariable("userId") String userId, @PathVariable("money") Integer money) {//return CxResult.success(orderTblService.add(userId, money));return CxResult.success(orderService.addOrder(userId, money));}}@Service
public class OrderService {@Resourceprivate OrderTccService orderTccService;@DubboReferenceprivate AccountProviderService accountProviderService;@GlobalTransactionalpublic Boolean addOrder(String userId, Integer money) {accountProviderService.addRecord(userId, money);orderTccService.prepareAdd(userId, money);if (money > 10000) {throw new BusinessException(ErrorMsg.COMMON_ERROR_1);}return Boolean.TRUE;}}@LocalTCC //1.开启TCC事务
public interface OrderTccService {// 2.标记TCC模式,注解在try接口上,并且声明confirm、cancel接口@TwoPhaseBusinessAction(name = "orderTcc", commitMethod = "commit", rollbackMethod = "rollback")Boolean prepareAdd(@BusinessActionContextParameter(paramName = "userId") String userId,@BusinessActionContextParameter(paramName = "money") Integer money);boolean commit(BusinessActionContext businessActionContext);boolean rollback(BusinessActionContext businessActionContext);}@Service
@Slf4j
public class OrderTccServiceImpl implements OrderTccService {// 模拟数据库存储HashMap<String, Integer> map = Maps.newHashMap();@Resourceprivate OrderTblService orderTblService;@Overridepublic Boolean prepareAdd(String userId, Integer money) {String xid = RootContext.getXID();OrderTbl orderTbl = new OrderTbl();orderTbl.setUserId(userId);orderTbl.setMoney(money);orderTblService.save(orderTbl);map.put(xid, orderTbl.getId());log.info("prepareAdd xid = {} orderId = {} userid = {} money= {}", xid, orderTbl.getId(), userId, money);return Boolean.TRUE;}@Override@Transactionalpublic boolean commit(BusinessActionContext businessActionContext) {log.info("commit xid = {}", businessActionContext.getXid());return null != map.remove(businessActionContext.getXid()) ? true : false;}@Override@Transactionalpublic boolean rollback(BusinessActionContext businessActionContext) {log.info("rollback xid = {}", businessActionContext.getXid());Integer orderId = map.get(businessActionContext.getXid());orderTblService.removeById(orderId);return true;}}
账户服务代码调整
@DubboService
public class AccountProvider implements AccountProviderService {@Resourceprivate AccountTblService accountTblService;@Resourceprivate AccountTccService accountTccService;@Override@GlobalTransactionalpublic void addRecord(String userId, Integer money) {
// AccountTbl accountTbl = new AccountTbl();
// accountTbl.setUserId(userId);
// accountTbl.setMoney(money);
// accountTblService.save(accountTbl);accountTccService.prepareAdd(userId, money);}}@LocalTCC //1.开启TCC事务
public interface AccountTccService {// 2.标记TCC模式,注解在try接口上,并且声明confirm、cancel接口@TwoPhaseBusinessAction(name = "accountTcc", commitMethod = "commit", rollbackMethod = "rollback")Boolean prepareAdd(@BusinessActionContextParameter(paramName = "userId") String userId,@BusinessActionContextParameter(paramName = "money") Integer money);boolean commit(BusinessActionContext businessActionContext);boolean rollback(BusinessActionContext businessActionContext);}@Service
@Slf4j
public class AccountTccServiceImpl implements AccountTccService {// 模拟数据库存储HashMap<String, Integer> map = Maps.newHashMap();@Resourceprivate AccountTblService accountTblService;@Overridepublic Boolean prepareAdd(String userId, Integer money) {String xid = RootContext.getXID();AccountTbl accountTbl = new AccountTbl();accountTbl.setUserId(userId);accountTbl.setMoney(money);accountTblService.save(accountTbl);map.put(xid, accountTbl.getId());log.info("prepareAdd xid = {} accountId = {} userid = {} money= {}", xid, accountTbl.getId(), userId, money);return Boolean.TRUE;}@Override@Transactionalpublic boolean commit(BusinessActionContext businessActionContext) {log.info("commit xid = {} ", businessActionContext.getXid());return null != map.remove(businessActionContext.getXid()) ? true : false;}@Override@Transactionalpublic boolean rollback(BusinessActionContext businessActionContext) {log.info("rollback xid = {} ", businessActionContext.getXid());Integer accountId = map.get(businessActionContext.getXid());accountTblService.removeById(accountId);return true;}
}
3.SAGA
Saga 模式是长事务解决方案,适用于业务流程长且需要保证事务最终一致性的业务系统,Saga 模式一阶段就会提交本地事务,无锁,长流程情况下可以保证性能,多用于渠道层、集成层业务系统。事务参与者可能是其它公司的服务或者是遗留系统的服务,无法进行改造和提供 TCC 要求的接口,也可以使用 Saga 模式。
Saga模式不依赖数据源。

待完善。
4.XA(eXtended Architecture)
XA模式是分布式强一致性的解决方案,但性能低而使用较少。
XA模式只支持实现了XA协议的数据库。Seata支持MySQL、Oracle、PostgreSQL和MariaDB。

4.1 优缺点
优点:
强一致性,满足ACID要求。
实现简单,对业务代码零入侵。
缺点:
需要关系型数据库支持。
整个过程长时间锁定资源,性能极差。
4.2 Demo
详细代码参考:Springboot 集成 Seata-CSDN博客
待完善。
相关文章:
Seata 四种事务模式
Seata 是一款开源的分布式事务解决方案,致力于提供高性能和简单易用的分布式事务服务。Seata 将为用户提供了 AT、TCC、SAGA 和 XA 事务模式,为用户打造一站式的分布式解决方案。 全文参考文献:中文文档 TC (Transaction Coordinator) - 事务…...
超好用的IDEA插件推荐,写完代码直接调试接口
Apipost推出IDEA插件非常省时高效,写完代码直接可以进行调试,而且支持生成接口文档,真是后端神器啊! 可以点击下方链接安装更新或在插件商店中搜索安装 下载链接:https://plugins.jetbrains.com/plugin/22676-apipos…...
发送post请求、携带cookie、响应对象、高级用法
发送post请求 请求体中,两种方式:data{} ⇢ \dashrightarrow ⇢ 编码格式 urlencoded ⇢ \dashrightarrow ⇢ keyvalue&keyvaluejson{} ⇢ \dashrightarrow ⇢ 编码格式是json 使用方式: resrequests.post(url) 模拟登录 import …...
JMeter接口测试性能测试
目前最新版本发展到5.0版本,需要Java7以上版本环境,下载解压目录后,进入\apache-jmeter-5.0\bin\,双击ApacheJMeter.jar文件启动JMemter。 1、创建测试任务 添加线程组,右击测试计划,在快捷菜单单击添加-…...
MongoDB——MongoDB删除系统自带的local数据库
一、MongoDB删除系统自带的local数据库 1.1、linux环境进入mongo客户端 输入 mongo 命令,进入命令行客户端 进入admin库,并登录,查看所有数据库 #进入admin库 use admin #并登录admin db.auth("username","password")…...
【LeetCode刷题-链表】--203.移除链表元素
203.移除链表元素 方法:定义一个节点指向头节点head,避免头结点单独操作 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode() {}* ListNode(int val) { this.val val; }* …...
Microsoft Dynamics 365 CE 扩展定制 - 3. SDK企业功能
在本章中,我们将介绍以下内容: 服务器端并发控制客户端并发控制在事务中执行请求批处理请求暂存数据导入创建早期绑定的实体类扩展CrmSvcUtil用Filter扩展CrmSvcUtil以生成选项集枚举使用CRM配置迁移工具跨实例迁移配置简介 回顾Dynamics CRM的历史,该产品经过多年的发展以…...
人工智能基础_机器学习016_BGD批量梯度下降求解多元一次方程_使用SGD随机梯度下降计算一元一次方程---人工智能工作笔记0056
然后上面我们用BGD计算了一元一次方程,那么现在我们使用BGD来进行计算多元一次方程 对多元一次方程进行批量梯度下降. import numpy as np X = np.random.rand(100,8) 首先因为是8元一次方程,我们要生成100行8列的X的数据对应x1到x8 w = np.random.randint(1,10,size = (8…...
硬件测试(二):波形质量
一、信号质量测试 信号在传输的过程中,一般不是标准的矩形波信号,信号质量测试即通过示波器测试单板硬件的数字信号和模拟信号的各项指标,包括电源、时钟、复位、CPU小系统、外部接口(USB、网口、串口)、逻辑芯片(CPLD…...
PostgreSQL 数据库日志相关参数
PostgreSQL数据库的配置主要是通过修改数据目录下的 postgresql.conf和pg_hba.conf文件来实现的。 如果想从其他机器上登录该数据 库,需要把监听地址改成实际网络的地址,一种简单的方法是把地址 改成“*”,表示在本地的所有地址上监听&#…...
delete请求,express获取req.body失败
使用 Express 框架处理 DELETE 请求时,通常情况下是不会有请求体的。DELETE 请求通常用于删除资源,而不是发送数据。因此, Express 默认情况下不会解析 DELETE 请求的请求体。 如果需要在 DELETE 请求中发送数据,一种常见的做法是…...
2023年江西省职业院校技能竞赛“网络安全”赛项样题
二、竞赛注意事项 1.竞赛期间禁止携带和使用移动存储设备、计算器、通信工具及 参考资料。 2.请根据大赛所提供的竞赛环境,检查所列的硬件设备、软件清 单、材料清单是否齐全,计算机设备是否能正常使用。 3.在进行任何操作之前,请阅读每个部分…...
groovy下载与安装
Groovy是一种基于JVM(Java虚拟机)的敏捷开发语言,它结合了Python、Ruby和Smalltalk的许多强大的特性,Groovy 代码能够与 Java 代码很好地结合,也能用于扩展现有代码。由于其运行在 JVM 上的特性,Groovy也可…...
Hugging Face LLM部署大语言模型到亚马逊云科技Amazon SageMaker推理示例
本篇文章主要介绍如何使用新的Hugging Face LLM推理容器将开源LLMs,比如BLOOM大型语言模型部署到亚马逊云科技Amazon SageMaker进行推理的示例。我们将部署12B Open Assistant Model,这是一款由开放助手计划训练的开源Chat LLM。 这个示例包括࿱…...
内向基环树
例题1 例题2...
k8s replicaSet,deployment 学习笔记
文章目录 replicaSet 和 deployment 两者的关系。创建滚动更新回滚 replicaSet 和 deployment 两者的关系。 在 Kubernetes 中,ReplicaSet 和 Deployment 都是用来确保某种 Pod 的副本数目。但是,ReplicaSet 和 Deployment 是有差别的,二者的…...
Zabbix监控原理 安装
一、监控介绍 1、监控目的 监控是需要站在公司的业务角度去考虑,而不是针对某个监控技术的使用 对系统不间断时实监控 实际上是对系统不间断的时实监控 实时反馈系统当前状态 我们监控某个硬件、或者系统,都是需要能时实看到当前系统的状态&#x…...
我和“云栖大会”的双向奔赴
目录 引言初次参加云栖大会云栖大会带来的技术风向标本届大会最强技术有哪些?云栖大会对我职业生涯的影响个人对未来云栖大会的期待和建议结语 引言 想必大家对“云栖大会”并不陌生,“云栖大会”作为国内最具规模和影响力的云计算盛会,每年…...
HarmonyOS UI 开发
引言 HarmonyOS 提供了强大的 UI 开发工具和组件,使开发者能够创建吸引人的用户界面。本章将详细介绍在 HarmonyOS 中应用 JS、CSS、HTML,HarmonyOS 的 UI 组件以及如何自定义 UI 组件。 目录 JS、CSS、HTML 在 HarmonyOS 中的应用HarmonyOS 的 UI 组…...
中国移动发布《新型智慧城市白皮书》(2023版)
加gzh“大数据食铁兽”,回“20231101”,获取材料完整版 导读 通过本系列白皮书,我们系统的阐述了中国移动对中国智慧城市发展趋势,并对中国移动服务智慧城市建设六大核心能力进行了介绍,详细说明了中国移动智慧城市…...
wordpress后台更新后 前端没变化的解决方法
使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…...
论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(二)
HoST框架核心实现方法详解 - 论文深度解读(第二部分) 《Learning Humanoid Standing-up Control across Diverse Postures》 系列文章: 论文深度解读 + 算法与代码分析(二) 作者机构: 上海AI Lab, 上海交通大学, 香港大学, 浙江大学, 香港中文大学 论文主题: 人形机器人…...
iPhone密码忘记了办?iPhoneUnlocker,iPhone解锁工具Aiseesoft iPhone Unlocker 高级注册版分享
平时用 iPhone 的时候,难免会碰到解锁的麻烦事。比如密码忘了、人脸识别 / 指纹识别突然不灵,或者买了二手 iPhone 却被原来的 iCloud 账号锁住,这时候就需要靠谱的解锁工具来帮忙了。Aiseesoft iPhone Unlocker 就是专门解决这些问题的软件&…...
Objective-C常用命名规范总结
【OC】常用命名规范总结 文章目录 【OC】常用命名规范总结1.类名(Class Name)2.协议名(Protocol Name)3.方法名(Method Name)4.属性名(Property Name)5.局部变量/实例变量(Local / Instance Variables&…...
python如何将word的doc另存为docx
将 DOCX 文件另存为 DOCX 格式(Python 实现) 在 Python 中,你可以使用 python-docx 库来操作 Word 文档。不过需要注意的是,.doc 是旧的 Word 格式,而 .docx 是新的基于 XML 的格式。python-docx 只能处理 .docx 格式…...
Android15默认授权浮窗权限
我们经常有那种需求,客户需要定制的apk集成在ROM中,并且默认授予其【显示在其他应用的上层】权限,也就是我们常说的浮窗权限,那么我们就可以通过以下方法在wms、ams等系统服务的systemReady()方法中调用即可实现预置应用默认授权浮…...
大学生职业发展与就业创业指导教学评价
这里是引用 作为软工2203/2204班的学生,我们非常感谢您在《大学生职业发展与就业创业指导》课程中的悉心教导。这门课程对我们即将面临实习和就业的工科学生来说至关重要,而您认真负责的教学态度,让课程的每一部分都充满了实用价值。 尤其让我…...
使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台
🎯 使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台 📌 项目背景 随着大语言模型(LLM)的广泛应用,开发者常面临多个挑战: 各大模型(OpenAI、Claude、Gemini、Ollama)接口风格不统一;缺乏一个统一平台进行模型调用与测试;本地模型 Ollama 的集成与前…...
在web-view 加载的本地及远程HTML中调用uniapp的API及网页和vue页面是如何通讯的?
uni-app 中 Web-view 与 Vue 页面的通讯机制详解 一、Web-view 简介 Web-view 是 uni-app 提供的一个重要组件,用于在原生应用中加载 HTML 页面: 支持加载本地 HTML 文件支持加载远程 HTML 页面实现 Web 与原生的双向通讯可用于嵌入第三方网页或 H5 应…...
Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信
文章目录 Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信前言一、网络通信基础概念二、服务端与客户端的完整流程图解三、每一步的详细讲解和代码示例1. 创建Socket(服务端和客户端都要)2. 绑定本地地址和端口&#x…...
