Appearance
如果AlibabaCloud版本与seata版本不匹配,可以用以下方式解决:
xml
<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,下面是示例(使用Seata的每个微服务都添加):
yaml
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模式
一种基于数据库本身特性实现的分布式事务,核心在于二阶段提交:
- 准备阶段:协调者(通常是分布式系统的中心节点)向参与者(各个数据库或资源管理器)发送事务请求,并询问它们是否可以执行该事务。如果所有参与者都成功执行了事务,那么协调者会进入第二阶段。否则,如果有一个参与者无法执行事务,那么协调者会中止该事务。
- 提交请求阶段:如果协调者在准备阶段收到的所有参与者的执行结果都是成功的,那么它会向所有参与者发送提交请求。参与者收到提交请求后,会将事务进行持久化,并返回确认消息给协调者。
- 提交阶段(Commit Phase):协调者在收到所有参与者的确认消息后,会向所有参与者发送最终的提交指令。参与者收到指令后,正式提交事务,并释放相关资源。如果其中任何一个参与者无法提交事务,那么协调者会向所有参与者发送回滚指令,使它们回滚到事务开始前的状态。
TIP
XA模式有几个缺陷:①依赖数据库底层支持;②性能不行,如果执行的SQL比较多,或某一条SQL执行时间长,导致被加锁,资源无法访问等问题;
使用方式
yaml
# application.yml
seata:
data-source-proxy-mode: XA
在方法上添加注解:@GlobalTransactional
java
@GlobalTransactional