1. 项目集成顺序
1.1 引入依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-seata</artifactId>
<version>2.1.0.RELEASE</version>
<exclusions>
<exclusion>
<artifactId>seata-all</artifactId>
<groupId>io.seata</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>io.seata</groupId>
<artifactId>seata-all</artifactId>
<version>${seata.version}</version>
</dependency>
引入 spring-cloud-alibaba-seata 是为了实现微服务链路中的XID传递,内置版本包太低,需要排除重新引入更高版本
1.2 部署配置文件
需要配置的配置文件有两个, registry.conf 和 file.conf .
registry.conf 的作用是 服务注册与配置文件引导。
file.conf 里面是 seata的一些配置。
有几个重要的参数需要关注一下:
vgroupMapping.my_test_tx_group = "choice-seata-tst"
这个里面的 my_test_tx_group 是配置文件中的 spring.cloud.alibaba.seata.tx-service-group
值对应的seata-server 注册的服务名
retryInterval = 10
retryTimes = 100
seata为了保障事务脏读脏写采用了全局锁的机制, 如果拿不到全局锁,会根据这两个参数来配置重试时间间隔和重试次数, 这俩参数会影响接口的成功率和性能,需要多多讨论。
1.3 配置自动代理数据源
seata 实现原理就是代理数据源生成镜像文件, 1.1.0版本之前是通过配置文件生成,之后改成注解方式实现, 我们需要在启动类上增加@EnableAutoDataSourceProxy
1.4 配置异常处理
可选, 我们可以自己实现FailureHandler 并在创建GlobalTransactionScanner的时候初始化自定义FailureHandler , 我初步试了一下还没整完, 如果有这个需求(如undoLog回滚失败钉钉报警) 我们可以继续探讨。
1.5 在全局事务发起的地方增加全局事务注解
指定名字和回滚规则就行了, 名字起啥都行,打日志用的,也方便定位代码
2.注意事项:
- 必须代理数据源,这是seata实现的基础
- 业务表中必须有个单列主键,如果存在符合主键需建一个业务无关的, 源主键建唯一索引,seata实现全局锁以及镜像的时候,都是拿着唯一主键操作的,目前不支持多主键,他们正在开发 3.被调用方可以不加全局事务注解, 通过ConnectionProxy 和 XID 可以实现事务发现。
- 如果希望全局事务生效, 必须把异常抛出让调用方感知到,因为全局事务的回滚是TM触发的,TM是通过try catch 异常来执行回滚操作的。
- 全局事务注解可与spring的事务注解连用, 连用可减少与seata - server的交互。但全局事务注解的作用域要大于本地事务注解。 解释一下: 我们都知道如果未加事务注解, connection 的自动提交是开启的,每条sql都会提交事务,每个事务提交都会与seata-server交互, 加上这个可以一块提交, 减少交互。