首页 > 其他分享 >Spring Cloud 系列:基于Seata 实现 XA模式

Spring Cloud 系列:基于Seata 实现 XA模式

时间:2024-01-25 21:45:30浏览次数:22  
标签:事务 Seata Spring 数据库 XA 模式 阶段

https://seata.io/zh-cn/docs/user/mode/xa

https://seata.io/zh-cn/docs/dev/mode/xa-mode

XA 规范 是 X/Open 组织定义的分布式事务处理(DTP,Distributed Transaction Processing)标准,XA 规范 描述了全局的TM与局部的RM之间的接口,几乎所有主流的数据库都对 XA 规范 提供了支持。

XA 模式是从 1.2 版本支持的事务模式。XA 规范 是 X/Open 组织定义的分布式事务处理(DTP,Distributed Transaction Processing)标准。Seata XA 模式是利用事务资源(数据库、消息服务等)对 XA 协议的支持,以 XA 协议的机制来管理分支事务的一种事务模式。

前提

  • 基于支持本地 ACID 事务的关系型数据库。
  • Java 应用,通过 JDBC 访问数据库。

两阶段提交

XA是规范,目前主流数据库都实现了这种规范,实现的原理都是基于两阶段提交。

正常情况:

image

异常情况:

image

一阶段:

  • 事务协调者通知每个事物参与者执行本地事务
  • 本地事务执行完成后报告事务执行状态给事务协调者,此时事务不提交,继续持有数据库锁

二阶段:

  • 事务协调者基于一阶段的报告来判断下一步操作
    • 如果一阶段都成功,则通知所有事务参与者,提交事务
    • 如果一阶段任意一个参与者失败,则通知所有事务参与者回滚事务

4.1.2.Seata的XA模型

Seata对原始的XA模式做了简单的封装和改造,以适应自己的事务模型,基本架构如图:

image

RM一阶段的工作:

​ ① 注册分支事务到TC

​ ② 执行分支业务sql但不提交

​ ③ 报告执行状态到TC

TC二阶段的工作:

  • TC检测各分支事务执行状态

    a.如果都成功,通知所有RM提交事务

    b.如果有失败,通知所有RM回滚事务

RM二阶段的工作:

  • 接收TC指令,提交或回滚事务

优缺点

XA模式的优点是什么?

  • 事务的强一致性,满足ACID原则。
  • 常用数据库都支持,实现简单,并且没有代码侵入

XA模式的缺点是什么?

  • 因为一阶段需要锁定数据库资源,等待二阶段结束才释放,性能较差
  • 依赖关系型数据库实现事务

实现XA模式

Seata的starter已经完成了XA模式的自动装配,实现非常简单,步骤如下:

1)修改application.yml文件(每个参与事务的微服务),开启XA模式:

seata:
  enabled: true
  tx-service-group: default_tx_group # 事务组名称
  service:
    vgroup-mapping:
      default_tx_group: default
    grouplist:
      default: 127.0.0.1:8091
  data-source-proxy-mode: XA

2)给发起全局事务的入口方法添加@GlobalTransactional注解:

本例中是OrderServiceImpl中的create方法.

image

四种模式对比

我们从以下几个方面来对比四种实现:

  • 一致性:能否保证事务的一致性?强一致还是最终一致?
  • 隔离性:事务之间的隔离性如何?
  • 代码侵入:是否需要对业务代码改造?
  • 性能:有无性能损耗?
  • 场景:常见的业务场景

如图:

image

标签:事务,Seata,Spring,数据库,XA,模式,阶段
From: https://www.cnblogs.com/vic-tory/p/17988236

相关文章

  • 记一次Spring retry的使用
    问题背景调用三方平台接口偶尔会访问不到,导致了逻辑错误具体描述由于工作职责重新划分,我新接手维护了一个项目,这个项目已经开发完成,项目中需要和第三方平台进行对接,主要是我方向对方推送数据但是刚接手没几天,实施同事就反馈过来一个问题,我们推送过去的数据在对方那边显示......
  • Spring Task定时任务
    任务调度任务调度是为了让系统自动完成任务,在约定好的特定时刻去执行任务的过程列如:在电商系统中需要在下午6点自动发送优惠卷订票系统中根据车次不同,不同时间段分批发票实现任务调度方法多线程方式,利用sleepJDK提供的API:列如Timer,ScheduledExecutor列如Quartzspring......
  • SpringBoot 接口数据加解密解说,你的系统真的安全吗?
    xx项目有于安全问题,需要对接口整体进行加密处理,额,摸摸头上飘摇着而稀疏的长发,感觉我爱了。和产品、前端同学对外需求后,梳理了相关技术方案,主要的需求点如下:尽量少改动,不影响之前的业务逻辑;考虑到时间紧迫性,可采用对称性加密方式,服务需要对接安卓、IOS、H5三端,另外考虑到H5端存储密......
  • 三、SpringCloud Alibaba之Ribbon
    3.1、负载均衡介绍单台服务器不管好好坏总是会遇到性能瓶颈,而解决单台服务器瓶颈方式就是采用集群。高性能集群的本质很简单,通过增加更多的服务器来提升系统整体的计算能力。在一个集群中,每一台服务器提供的功能是一样,但是每一台服务器的类型可能是不一样的(性能、配置、价格等等),......
  • Spring Boot框架actuator配置不当漏洞
    漏洞描述【安全预警】ApacheDubbo远程代码执行漏洞、SpringBoot配置不当及微软1月补丁漏洞部分网站数据库存在SpringBoot配置不当漏洞,利用网站数据库SpringBoot漏洞可读取Redis数据库用户名和密码。连接数据库可查询掌握运维综合服务平台管理员口令哈希。漏洞等级......
  • SpringBoot 依赖管理机制
     依赖管理机制思考:1、为什么导入starter-web所有相关依赖都导入进来?开发什么场景,导入什么场景启动器。maven依赖传递原则。     A依赖B B依赖C:   导入A就拥有B和C导入场景启动器。场景启动器自动把这个场景的所有核心依赖全部导入进来2、为什么版......
  • 7.spring mongo
    配置MongoRepository可以根据实体中的字段,自己进行组合查询,创建一个继承MongoRepository的接口,在该接口中定义方法示例实体类importlombok.Getter;importlombok.Setter;importorg.bson.types.ObjectId;importorg.springframework.data.annotation.Id;importorg.......
  • spring boot lombok插件
    Lombok集成首先我们需要在IDEA中安装好Lombok插件,如果你使用的是最新版IDEA2020.3,则Lombok插件已经内置,无需安装。 之后在项目的pom.xml文件中添加Lombok依赖,SpringBoot2.1.x版本后无需指定Lombok版本,SpringBoot在spring-boot-dependencies中已经内置。<!--lombok依赖--><......
  • 17 位社区大咖寄语,Seata 进入 Apache 孵化器
    北京时间2023年10月29日,分布式事务开源项目Seata正式通过Apache基金会的投票决议,以全票通过的优秀表现正式成为Apache孵化器项目!根据Apache基金会邮件列表显示,在包含13个约束性投票(bindingvotes)和6个无约束性投票(non-bindingvotes)的投票全部持赞同意见......
  • Spring的事务使用教程
    什么是事务?事务(Transaction)是数据库操作最基本单元,逻辑上一组操作,要么都成功,要么都失败,如果操作之间有一个失败所有操作都失败。事务四个特性(ACID)原子性一组操作要么都成功,要么都失败。一致性一组数据从事务1合法状态转为事务2的另一种合法状态,就是一致。隔离性事务1......