用来解决分布式事务的方案--Seata

937 阅读5分钟

Seata 是什么?

官方网站

Seata 是一款开源的分布式事务解决方案,致力于提供高性能和简单易用的分布式事务服务。Seata 将为用户提供了 AT、TCC、SAGA 和 XA 事务模式,为用户打造一站式的分布式解决方案。

image.png

分布式事务产生

一个重要原因,就是参与事务的多个分支事务互相无感知,不知道彼此的执行状态。因此解决分布式事务的思想非常简单:

就是找一个统一的事务协调者,与多个分支事务通信,检测每个分支事务的执行状态,保证全局事务下的每一个分支事务同时成功或失败即可。大多数的分布式事务框架都是基于这个理论来实现的。

在Seata的事务管理中有三个重要的角色:

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

工作流程

  1. 全局事务开始:TM 向 TC 注册一个新的全局事务。
  2. 分支事务注册:RM 向 TC 注册分支事务,并预留资源。
  3. Try 阶段:RM 执行 Try 操作,预留资源但不真正修改数据。
  4. Confirm 或 Cancel:如果 Try 阶段成功,TM 请求 TC 提交全局事务;如果失败,则请求回滚。
  5. 全局事务提交/回滚:TC 根据 TM 的请求,通知 RM 执行 Confirm 或 Cancel 操作。

AT模式(最终一致性)

  • 基于支持本地 ACID 事务的关系型数据库。
  • Java 应用,通过 JDBC 访问数据库。
执行流程

image.png

如何使用
  • 配置文件中配置,
spring:
  cloud:
    sentinel:
      transport:
        dashboard: localhost:8090
      http-method-specify: true # 开启请求方式前缀

配置文件中指定要采用的分布式事务模式。我们可以在Nacos中的共享shared-seata.yaml配置文件中设置:

seata:
  data-source-proxy-mode: AT

pom文件中加入如下配置

<!--seata-->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-seata</artifactId>
</dependency>
<!--sentinel-->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
  • 利用@GlobalTransactional标记分布式事务的入口方法

image.png

优点
  • 一阶段提交本地事务,无锁,高性能
  • 事件驱动架构,参与者可异步执行,高吞吐
  • 补偿服务易于实现

XA模式(强一致性)

XA 规范 是 X/Open 组织定义的分布式事务处理(DTP,Distributed Transaction Processing)标准,XA 规范 描述了全局的TM与局部的RM之间的接口,几乎所有主流的数据库都对 XA 规范 提供了支持。

image.png

优点
  • 事务的强一致性,满足ACID原则
  • 常用数据库都支持,实现简单,并且没有代码侵入
缺点
  • 因为一阶段需要锁定数据库资源,等待二阶段结束才释放,性能较差
  • 依赖关系型数据库实现事务
实现步骤
  • 参考AT模式

Seata Saga 模式

  • 概述: Saga 模式是 SEATA 提供的长事务解决方案,在 Saga 模式中,业务流程中每个参与者都提交本地事务,当出现某一个参与者失败则补偿前面已经成功的参与者,一阶段正向服务和二阶段补偿服务都由业务开发实现。

  • 适用场景:
    1.业务流程长、业务流程多
    2.参与者包含其它公司或遗留系统服务,无法提供 TCC 模式要求的三个接口

  • 优势:
    1.一阶段提交本地事务,无锁,高性能 2.事件驱动架构,参与者可异步执行,高吞吐
    3.补偿服务易于实现

  • 缺点: 不保证隔离性

快速开始

基于 dubbo 构建的微服务下,使用 Saga 模式演示分布式事务的提交和回滚 实现参考官方文档
Seata Saga 模式快速开始

Seata TCC 模式

  • 概述: TCC 模式是 Seata 支持的一种由业务方细粒度控制的侵入式分布式事务解决方案,是继 AT 模式后第二种支持的事务模式,最早由蚂蚁金服贡献。其分布式事务模型直接作用于服务层,不依赖底层数据库,可以灵活选择业务资源的锁定粒度,减少资源锁持有时间,可扩展性好,可以说是为独立部署的 SOA 服务而设计的。

image.png

  • 优点:TCC 完全不依赖底层数据库,能够实现跨数据库、跨应用资源管理,可以提供给业务方更细粒度的控制。
  • 缺点:TCC 是一种侵入式的分布式事务解决方案,需要业务系统自行实现 Try,Confirm,Cancel 三个操作,对业务系统有着非常大的入侵性,设计相对复杂。
  • 适用场景:TCC 模式是高性能分布式事务解决方案,适用于核心系统等对性能有很高要求的场景
基本使用

参考官方文档Seata TCC模式基本使用

简述AT模式与XA模式最大的区别是什么?

  • XA模式一阶段不提交事务,锁定资源;AT模式一阶段直接提交,不锁定资源。
  • XA模式依赖数据库机制实现回滚;AT模式利用数据快照实现数据回滚。
  • XA模式强一致;AT模式最终一致

可见,AT模式使用起来更加简单,无业务侵入,性能更好。因此企业90%的分布式事务都可以用AT模式来解决。