一.项目构建
1.1导依赖
各个项目的版本依赖是不一样的,我这做个示例。
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-seata</artifactId>
<exclusions>
<!--版本较低,1.3.0,因此排除-->
<exclusion>
<artifactId>seata-spring-boot-starter</artifactId>
<groupId>io.seata</groupId>
</exclusion>
</exclusions>
</dependency>
<!--seata starter 采用1.4.2版本-->
<dependency>
<groupId>io.seata</groupId>
<artifactId>seata-spring-boot-starter</artifactId>
<version>1.4.2</version>
</dependency>
1.2写xml配置文件
需要在各个微服务中修改application.yml文件,添加一些配置:
seata:
registry: # TC服务注册中心的配置,微服务根据这些信息去注册中心获取tc服务地址
# 参考tc服务自己的registry.conf中的配置
type: nacos
nacos: # tc
server-addr: 127.0.0.1:8848
namespace: ""
group: DEFAULT_GROUP
application: seata-tc-server # tc服务在nacos中的服务名称
cluster: default
tx-service-group: seata-demo # 事务组,根据这个获取tc服务的cluster名称
service:
vgroup-mapping: # 事务组与TC服务cluster的映射关系
seata-demo: default
data-source-proxy-mode: XA //这儿是模式
1.3注册到Nacos中的微服务
我们知道注册到Nacos中的微服务,确定一个具体实例需要四个信息:
namespace:命名空间
group:分组
application:服务名
cluster:集群名
这四个信息,在seata-server包的配置文件里进行配置。
地址在http://seata.io/zh-cn/blog/download.html
![](https://i-blog.csdnimg.cn/blog_migrate/c17daf96c6adf087d877a04078bba4b2.png)
![](https://i-blog.csdnimg.cn/blog_migrate/187964e213aa6cd3cedabafdd6aa6b5f.png)
添加配置
registry {
# tc服务的注册中心类,这里选择nacos,也可以是eureka、zookeeper等
type = "nacos"
nacos {
# seata tc 服务注册到 nacos的服务名称,可以自定义
application = "seata-tc-server"
serverAddr = "127.0.0.1:8848"
group = "DEFAULT_GROUP"
namespace = ""
cluster = "default"
username = "nacos"
password = "nacos"
}
}
![](https://i-blog.csdnimg.cn/blog_migrate/fef880d9e3a1ae186fcf00f55c0c8dfd.png)
1.4添加@GlobalTransactional注解在具体的实现service类上
二.四种模式
2.1XA模式
![](https://i-blog.csdnimg.cn/blog_migrate/01ae2229d1491491883b06dd72c429e6.png)
Seata的starter已经完成了XA模式的自动装配,实现非常简单,步骤如下:
1)修改application.yml文件(每个参与事务的微服务),开启XA模式:
![](https://i-blog.csdnimg.cn/blog_migrate/498d69c3ee01dc3d59ca44414ebd6589.png)
2)给发起全局事务的入口方法添加@GlobalTransactional注解:上面搭建时候已经添加过了,再贴图下
![](https://i-blog.csdnimg.cn/blog_migrate/4dbb1e79a14a4744fb35eb137c566752.png)
重启服务并测试
2.2AT模式
AT模式同样是分阶段提交的事务模型,不过缺弥补了XA模型中资源锁定周期过长的缺陷。
![](https://i-blog.csdnimg.cn/blog_migrate/19433724cf84a12c31c99e829c312d30.png)
实现AT模式需要改下上面已经写好的xml文件的最后一行
seata:
data-source-proxy-mode: XA
阶段一RM的工作:
注册分支事务
记录undo-log(数据快照)
执行业务sql并提交
报告事务状态
阶段二提交时RM的工作:
删除undo-log即可
阶段二回滚时RM的工作:
根据undo-log恢复数据到更新前
2.3AT与XA的区别
简述AT模式与XA模式最大的区别是什么?
XA模式一阶段不提交事务,锁定资源;AT模式一阶段直接提交,不锁定资源。
XA模式依赖数据库机制实现回滚;AT模式利用数据快照实现数据回滚。
XA模式强一致;AT模式最终一致
等待更新后两种模式