分布式事务解决方案Seata谁建议你用的?

news2024/11/26 11:56:09

一、名词解释:

 TC (Transaction Coordinator) - 事务协调者

维护全局/分支事务的状态,驱动全局事务的提交与回滚

TM (Transaction Manager) - 事务管理器

定义全局事务的范围:开启、提交、回滚全局事务

RM (Resource Manager) - 资源管理器

管理分支事务(本地事务)与TC交互,注册、报告分支事务状态,管理分支事务的提交、回滚

二、seata支持的模式

1、AT

如上图如果使用的是AT模式,需要在每个DB创建一个UNDO_LOG 表,把业务Sql和前后镜像SQL租出一条回滚记录插入该表

整体机制

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

        二阶段:分支事务全部成功,异步提交(删除回滚日志);分支事务有失败,通过一阶段的回滚日志进行补偿

注意点:

        1、t1,t2两个线程操作一条数据,t1分支事务提交前会获取全局事务,如果t1不释放全局事务,t2分支事务提交时获取全局锁会等待,直到t1全局事务是否或者t2超时退出

        2、AT中每个分支事务都是独立的,只要不更新同一条数据就没什么关系,即便发生更新同一条数据也只会在真正提交的时候等待全局事务,t1,t2几乎是并行的

        3、t2一阶段正持有本地锁并且等待获取全局锁;t1第二阶段回滚,需要获取本地锁,这个时候就出现了循环等待的情况(也就是我们常说的死锁条件),这个时候为了避免脏写,需要t2获取全局锁超时,释放本地锁,t1获取到本地锁执行回滚补偿

具体过程

  1. 解析 SQL:得到 SQL 的类型(UPDATE),表(product),条件(where name = 'TXC')等相关的信息。
  2. 查询前镜像:根据解析得到的条件信息,生成查询语句,定位数据。--一次查询
  3. 执行业务 SQL:更新这条记录的 name 为 'GTS'。-- 一条update
  4. 查询后镜像:根据前镜像的结果,通过 主键 定位数据。--一次查询
  5. 插入回滚日志:把前后镜像数据以及业务 SQL 相关的信息组成一条回滚日志记录,插入到 UNDO_LOG 表中。--一条insert
  6. 提交前,向 TC 注册分支:申请 product 表中,主键值等于 1 的记录的 全局锁 。
  7. 本地事务提交:业务数据的更新和前面步骤中生成的 UNDO LOG 一并提交。--一次更新(3和5一次本地事务提交)
  8. 将本地事务提交的结果上报给 TC。

期间多了两次查询,一条insert语句,比直接更新效率低了不止一倍

2、TCC

        1、需要业务编写prepare ,commit,rollback

        2、全局管理分支事务,不存在等待,需要自己维护业务逻辑(比如维护一个中间态,扣款的时候先冻结)

3、saga

        1、每个业务都需要单独实现数据的正向操作和逆向操作

        2、如果分支业务都正常,事务结束;如果分支业务异常,可正向或逆向补偿

4、XA

        1、执行业务前先获取全局事务,不存在分支事务情况

        2、t1未释放全局事务之前,t2一直等待或者超时

        3、最长得等时间=最长的分支RM

三、总结:

AT和XA

1、AT不需要单独配置,XA方式一:要求开发者配置 XADataSource,方式二:根据开发者的普通 DataSource 来创建但需要创建出相应的 XAConnection

2、AT分支事务单独管理释放,XA需要等待每个分支事务都释放(所有的分支事务时间依赖于最长的分支事务)

3、AT需要建UNDO_LOG表记录回滚日志,XA不需要建表

TCC和Saga

1、TCC需要实现三个接口,Saga业务维护状态通过补偿实现一致性

总体来说:

1、TCC,Saga需要业务代码侵入,并且是每个业务都要写一套

2、XA对接简单,并发量支持有限

3、AT如果链路较长,更新频繁,也可能存在等待时间较长

题外话:saga是不是有点像平时写代码不要事务,用job或MQ做最终一致性的样子

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/662681.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

云原生之深入解析如何使用Prometheus扩展Kubernetes调度器

一、kubernetes 调度配置 ① Scheduler Configuration kube-scheduler 提供了配置文件的资源,作为给 kube-scheduler 的配置文件,启动时通过 --config 来指定文件。目前各个 kubernetes 版本中使用的 KubeSchedulerConfiguration 为: 1.21 …

面试专题:spring

涉及到spring的问题都离不开IOC和AOP.AOP实现原理、动态代理和静态代理、Spring IOC的初始化过程、IOC原理、自己怎么实现一个IOC容器? 这些东西都是经常会被问到的。 IOC是什么: Ioc即控制反转,把原来的代码里需要实现的对象创建&#xff…

使用conda安装配置python环境

使用conda安装配置python环境 下载 我这里下载的是2-4.7.12.1,具体可以参考如下地址:https://mirrors.tuna.tsinghua.edu.cn/anaconda/miniconda/ wget https://mirrors.tuna.tsinghua.edu.cn/anaconda/miniconda/Miniconda2-4.7.12.1-Linux-x86_64.s…

d3dcompiler_47.dll缺失怎么修复?那个方法修复更简单

再运行游戏或者ps等软件,计算机系统提示找不到d3dcompiler_47.dll是怎么回事?相信困扰着不少小伙伴,其实d3dcompiler_47.dll是Microsoft 的 DirectX 11核心组件之一,它主要用于编译和运行 Direct3D 11应用程序和游戏。如果文件丢失…

编译安装LAMP

一、Apache网站服务: 1. Apache的起源(多系统兼容): Apache HTTPD Server 简称 Apache,是 Apache 软件基金会的一个开源的网页服务器, 可以在大多数计算机操作系统中运行,由于其多平台和安全性…

美国国家量子计划咨询委员会发布更新国家量子计划建议

​ (图片来源:网络) 耗资12亿美元的美国国家量子计划(NQI)于2018年12月颁布,该计划为期10年,现在将开展审查前五年的活动,并对今后五年的推进计划提出建议。为此,美国国…

[经验]PMP快速通过指南

我的备考经验: 1一阶段:铺底,花费时间1.5周左右 主要是熟悉考试框架和内容,通过看网盘资料里的章节重点解析视频课后习题。 先看框架你就很清楚的了解下来,PMP考试把项目管理的过程拆解成了5大过程组(启…

压力测试-JMeter安装、入门、结果分析

目录 1.写在前面 2.常用压测工具 3.压测机环境准备:JMeter部署 3.1 JMeter下载安装&启动&配置 3.2 入门案例 3.2.3、压测结果解释 3.2.4、线程属性参数原理 1.写在前面 等到服务上线后,在业务压力的冲击下,会发现程序运行非常…

CATIA和SolidWorks孰强孰弱?对比一下就知

寻找合适的 CAD 程序可能会很棘手,因为它是一种您将投资并使用的工具,您需要确保做出正确的决定。这篇文章将用于帮助区分 CATIA 和SOLIDWORKS之间的差异,以帮助您确定两者中哪一个最适合您的业务。 谁使用 CATIA? CATIA 于 198…

Selenium教程__环境安装(1)

Selenium是一个用于Web应用程序自动化测试工具。Selenium测试直接运行在浏览器中,就像真正的用户在操作一样。 Selenium基本上支持主流的浏览器,包括IE,Mozilla Firefox,Safari,Google Chrome,Opera等。 …

请求与响应

设置映射路径 在不同的bean中可能会出现相同名字的路径,这样的情况会产生冲突,为了解决这个冲突我们可以设置模块名作为请求路径前缀 Controller RequestMapping("/book") public class BookController {//设置当前操作的访问路径RequestMa…

Rust语言从入门到入坑——(4)Rust语法(下)

文章目录 0 引入1、结构体1. 1 结构体1. 2 结构体方法1. 3 元组结构体 2、枚举类2.1 match2.2 Option 枚举类 3、集合3.1 向量(Vector)3.2 字符串(String)3.1 映射表(Map) 4、总结 0 引入 在这里我们需要介…

DOM4J解析web.xml文件,实例化Servlet

1、DOM4J解析web.xml文件实例化Servlet 原理分析:我们解析用户在地址栏中输入的地址信息如add.do,用这个地址去web.xml文件中通过DOM4J技术,解析判断add.do对应的是哪个url-pattern,找到后获取对应的servlet-name。在用这个servlet-name去找…

servlet规范过滤器

我们可以把servlet程序看作是一个最终要执行的目标。我们可以使用过滤器filter来添加过滤代码,这个过滤代码可以添加到servlet执行之前,也可以添加到servlet执行之后。Filter可以做到在servlet这个目标程序执行之前过滤,也可以在目标程序执行…

【深度学习】BERT变种—百度ERNIE 3.0

预训练的模型在各种自然语言处理(NLP)任务中取得了最先进的成果。扩大预训练语言模型的规模可以提高其泛化能力。然而,现有的大规模预训练模型,主要依赖纯文本学习,缺乏大规模知识指导学习,模型能力存在局限…

尚硅谷大数据Flink1.17实战教程-笔记02【部署】

尚硅谷大数据技术-教程-学习路线-笔记汇总表【课程资料下载】视频地址:尚硅谷大数据Flink1.17实战教程从入门到精通_哔哩哔哩_bilibili 尚硅谷大数据Flink1.17实战教程-笔记01【Flink概述、Flink快速上手】尚硅谷大数据Flink1.17实战教程-笔记02【Flink部署】尚硅谷…

pycharm-设置python文件模板及常用的模板内容使用

pycharm设置文件和代码(File and Code Templates)模板步骤如下: 1.pycharm工具栏"file"->"Settings"->"Editor"->"Code Style"->"File and Code Templates",点击右侧python …

Badboy内置浏览器,提示脚本错误解决方法

Badboy内置浏览器,提示脚本错误解决方法 使用Badboy录制脚本的时候,浏览器弹框提示 “!当前页面的脚本发生错误。” 使用Badboy录制脚本的时候,弹框提示“当前页面的脚本发生错误” 解决方案1:在弹窗中选中不再弹出…

Java IO 学习总结(三)BufferedInputStream 缓冲流

Java IO 学习总结(一)输入流/输出流 Java IO 学习总结(二)File 类 Java IO 学习总结(三)BufferedInputStream 前言: 学习IO流,记录并分享。文章如有错误,恳请指正。 B…