整合Seata之使用XA模式

2024-02-11 SpringCloudSpringCloudAlibaba

如果AlibabaCloud版本与seata版本不匹配,可以用以下方式解决:

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-seata</artifactId>
    <!-- 自带1.6.1版本 -->
    <exclusions>
        <exclusion>
            <groupId>io.seata</groupId>
            <artifactId>seata-spring-boot-starter</artifactId>
        </exclusion>
    </exclusions>
</dependency>

<!-- 使用1.8.0版本 -->
<dependency>
    <groupId>io.seata</groupId>
    <artifactId>seata-spring-boot-starter</artifactId>
</dependency>

# application.yml配置

需要给Seata配置注册中心相关信息,这样Seata才能通过注册中心找到TC服务器,也就是Docker上启动的服务,Seata注册中心配置官网:Nacos 注册中心 | Apache Seata (opens new window),下面是示例(使用Seata的每个微服务都添加):

seata:
  registry:
    type: nacos
    nacos:
      application: seata-server # 如果不确定,可以到Nacos的服务列表查看,这个是部署时自己配置的
      server-addr: cloud:8848
      group : "XK857_CLOUD_GROUP"
      namespace: "dev"
      username: "nacos"
      password: "nacos"
  tx-service-group: default_tx_group # 事务组名称
  service:
    vgroup-mapping: # 事务组与cluster的映射关系
      default_tx_group: default

# XA模式

一种基于数据库本身特性实现的分布式事务,核心在于二阶段提交:

  1. 准备阶段:协调者(通常是分布式系统的中心节点)向参与者(各个数据库或资源管理器)发送事务请求,并询问它们是否可以执行该事务。如果所有参与者都成功执行了事务,那么协调者会进入第二阶段。否则,如果有一个参与者无法执行事务,那么协调者会中止该事务。
  2. 提交请求阶段:如果协调者在准备阶段收到的所有参与者的执行结果都是成功的,那么它会向所有参与者发送提交请求。参与者收到提交请求后,会将事务进行持久化,并返回确认消息给协调者。
  3. 提交阶段(Commit Phase):协调者在收到所有参与者的确认消息后,会向所有参与者发送最终的提交指令。参与者收到指令后,正式提交事务,并释放相关资源。如果其中任何一个参与者无法提交事务,那么协调者会向所有参与者发送回滚指令,使它们回滚到事务开始前的状态。

image-20240211100246493

XA模式有几个缺陷:①依赖数据库底层支持;②性能不行,如果执行的SQL比较多,或某一条SQL执行时间长,导致被加锁,资源无法访问等问题;

# 使用方式

# application.yml
seata:
  data-source-proxy-mode: XA

在方法上添加注解:@GlobalTransactional

@GlobalTransactional