seata 快速集成

298 阅读2分钟

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.注意事项:

  1. 必须代理数据源,这是seata实现的基础
  2. 业务表中必须有个单列主键,如果存在符合主键需建一个业务无关的, 源主键建唯一索引,seata实现全局锁以及镜像的时候,都是拿着唯一主键操作的,目前不支持多主键,他们正在开发 3.被调用方可以不加全局事务注解, 通过ConnectionProxy 和 XID 可以实现事务发现。
  3. 如果希望全局事务生效, 必须把异常抛出让调用方感知到,因为全局事务的回滚是TM触发的,TM是通过try catch 异常来执行回滚操作的。
  4. 全局事务注解可与spring的事务注解连用, 连用可减少与seata - server的交互。但全局事务注解的作用域要大于本地事务注解。 解释一下: 我们都知道如果未加事务注解, connection 的自动提交是开启的,每条sql都会提交事务,每个事务提交都会与seata-server交互, 加上这个可以一块提交, 减少交互。