Bootstrap

Seata简介

Seata的架构

  • TC(Transaction Coordintor)-事务协调者:维护全局和分支事务的状态,协调全局事务提交或者回滚。
  • TM:(Transaction Manager)-事务管理器:定义全局事务的范围,开始全局事务,提交和回滚事务
  • RM(Resource Manager)-资源管理器:管理分支事务,与TC交谈以注册分支事务和报告分支事务的状态

微服务整合seata(前提是你已经部署好了seata)

引入依赖

<!--seata-->
  <dependency>
      <groupId>com.alibaba.cloud</groupId>
      <artifactId>spring-cloud-starter-alibaba-seata</artifactId>
  </dependency>

在nacos上添加一个共享的seata配置,命名为shared-seata.yaml,内容如下:

seata:
  registry: # TC服务注册中心的配置,微服务根据这些信息去注册中心获取tc服务地址
    type: nacos # 注册中心类型 nacos
    nacos:
      server-addr: 192.168.203.130:8848 # nacos地址
      namespace: "" # namespace,默认为空
      group: DEFAULT_GROUP # 分组,默认是DEFAULT_GROUP
      application: seata-server # seata服务名称
      username: nacos
      password: nacos
  tx-service-group: zxm # 事务组名称
  service:
    vgroup-mapping: # 事务组与tc集群的映射关系
      zxm: "default"

然后去项目中的bootstrap.yaml文件中引入shared-seata.yaml共享配置

XA模式:

一阶段的工作:

  1. RM注册分支事务到TC
  2. Rm执行分支业务sql但不提交
  3. RM报告执行状态到TC

二阶段的工作:

  • TC检测各分支事务执行状态

                a. 如果都成功,通知所有RM提交

                b. 如果有失败,通知所有RM回滚事务

  • RM接收TC指令,提交或者回滚事务

Java中如何实现?

非常简单,第一步,在application.yaml中

seata:
  data-source-proxy-mode: XA #开启数据源代理的XA模式

第二步:给发起全局事务的入口方法添加@GlobalTransactional注解,再给远程调用的方法上加上@Transactional注解


AT模式:Seata主推的是AT模式,AT模式同样是分阶段提交的事务模型,不过弥补了XA模型中资源锁定周期过长的缺陷

阶段一RM的工作:

  • 注册分支事务
  • 记录undo-log(数据快照)
  • 执行业务sql并提交
  • 报告事务状态

阶段二提交时RM的工作:

  • 删除undo-log即可

阶段二回滚时RM的工作:

  • 根据undo-log恢复数据到更新前

在Java中使用AT模式:

第一,首先在每一个微服务项目中准备一个undo-log表,就是seata-at.sql

第二,application.yaml中

seata:
  data-source-proxy-mode: AT #开启数据源代理的AT模式

;