前言:Seata 是一个开源的分布式事务解决方案,旨在提供高性能和易于使用的分布式事务服务。它最初由阿里巴巴开源,现已成为 Linux 基金会旗下的一个项目。Seata 的名字源自于 “Simple Extensible Autonomous Transaction Architecture”,即简单可扩展的自治事务架构。

主要特性

  1. 高性能:Seata 采用了一系列优化策略,如并行处理、异步提交、分布式锁等,以确保在高并发场景下的高性能表现。
  2. 简单易用:Seata 提供了丰富的 API 和简洁的配置,使开发者可以快速上手并将其集成到现有系统中。
  3. 扩展性强:Seata 设计了可插拔的架构,开发者可以根据需要自定义和扩展事务管理策略。
  4. 多种事务模式:Seata 支持 AT(Automatic Transaction),TCC(Try-Confirm-Cancel),Saga 和 XA 等多种分布式事务模式,以适应不同的应用场景。

核心组件

  1. **TM (Transaction Manager)**:事务管理器,负责全局事务的生命周期管理,包括事务的开始、提交和回滚。
  2. **RM (Resource Manager)**:资源管理器,负责本地资源的管理(如数据库),并与 TC 通信,汇报本地事务的状态。
  3. **TC (Transaction Coordinator)**:事务协调器,负责全局事务的协调与状态维护,确保所有参与者的一致性。

Seata分布式事务

数据库导入

Seata考虑到持久化的需要,一般选择基于数据库存储,创建seata数据库,将sql脚本导入seata数据库

Docker部署

seata配置目录

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
db:
datasource: druid
db-type: mysql
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://数据库IP:3306/seata?rewriteBatchedStatements=true&serverTimezone=UTC
user: root
password: 数据库密码
min-conn: 10
max-conn: 100
global-table: global_table
branch-table: branch_table
lock-table: lock_table
distributed-lock-table: distributed_lock
query-limit: 1000
max-wait: 5000

seata配置文件夹拷贝至root目录

seata安装包拷贝至root目录

加载镜像文件

1
docker load -i seata-1.5.2.tar

启动

1
2
3
4
5
6
7
8
docker run --name seata \
-p 8099:8099 \
-p 7099:7099 \
-e SEATA_IP=192.168.58.101 \
-v ./seata:/seata-server/resources \
--privileged=true \
-d \
seataio/seata-server:1.5.2

效果展示

启动后,已经注册到了nacos中

image-20240613174648973

登录

http://部署的服务器IP:7099/ admin admin

image-20240613174807424

Nacos配置Seata

nacos配置管理添加shared-seata.yaml

DateID:shared-seata.yaml

配置格式:YAML

配置内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
seata:
registry: # TC服务注册中心的配置,微服务根据这些信息去注册中心获取tc服务地址
type: nacos # 注册中心类型 nacos
nacos:
server-addr: 192.168.58.101:8848 # nacos地址
namespace: "" # namespace,默认为空
group: DEFAULT_GROUP # 分组,默认是DEFAULT_GROUP
application: seata-server # seata服务名称
username: nacos
password: nacos
tx-service-group: hmall # 事务组名称
service:
vgroup-mapping: # 事务组与tc集群的映射关系
hmall: "default"

image-20240613164427677

项目集成

在需要用到分布式事务的微服务引入seata

1
2
3
4
5
<!--seata-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-seata</artifactId>
</dependency>

XA模式

在分布式事务处理中,XA(eXtended Architecture)是一种标准化的事务管理协议,用于保证多个资源(如数据库、消息队列等)在分布式环境下的事务一致性。XA 协议定义了事务管理器(Transaction Manager)和资源管理器(Resource Manager)之间的通信协议,确保事务的 ACID 特性(原子性、一致性、隔离性、持久性)。

XA 事务的基本概念

  1. 事务管理器(Transaction Manager)
    • XA 事务的协调者,负责协调多个资源管理器之间的事务操作,包括事务的开始(begin)、提交(commit)和回滚(rollback)等。
  2. 资源管理器(Resource Manager)
    • 实际的数据源或者服务,如数据库管理系统(DBMS)、消息队列等。每个资源管理器都实现了 XA 接口,支持在分布式事务中的协调操作。
  3. 全局事务
    • 包含多个参与者(资源管理器)的事务,由事务管理器统一管理。全局事务在执行期间必须保证所有参与者的操作要么全部提交成功,要么全部回滚。

XA 事务的工作流程

  1. 事务的开始(begin
    • 事务管理器向所有资源管理器发送事务开始请求,要求资源管理器准备好参与全局事务。
  2. 事务的执行
    • 应用程序通过事务管理器依次操作多个资源管理器,进行读取、更新等操作。
  3. 事务的提交(commit
    • 如果所有资源管理器的操作都成功完成,事务管理器发送提交请求,要求所有资源管理器提交其事务。如果有任何一个资源管理器无法提交,则事务管理器会发送回滚请求。
  4. 事务的回滚(rollback
    • 如果在事务执行期间发生错误或者有资源管理器无法提交,事务管理器发送回滚请求,要求所有资源管理器撤销其操作。

XA 事务在实际应用中的使用

在实际的分布式应用中,为了实现 XA 事务,通常需要以下步骤:

  • 使用支持 XA 协议的数据库或消息队列,如 MySQL、PostgreSQL、Oracle 等数据库和 ActiveMQ、RabbitMQ 等消息中间件。
  • 配置和启动一个兼容 XA 协议的事务管理器,如 Atomikos、Bitronix 等。
  • 在应用程序中使用事务管理器提供的 API 开启、提交和回滚事务,确保多个资源管理器之间的操作能够保持一致性。

总结

XA 是一种强大的分布式事务协议,能够帮助开发者在复杂的分布式环境中保证事务的一致性和可靠性。虽然使用 XA 协议能够解决分布式事务的问题,但也会带来额外的性能开销和复杂性,因此在选择是否使用 XA 时,需要权衡业务需求和系统的扩展性。

使用

nacos配置管理 shared-seata.yaml添加data-source-proxy-mode: XA

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
seata:
registry: # TC服务注册中心的配置,微服务根据这些信息去注册中心获取tc服务地址
type: nacos # 注册中心类型 nacos
nacos:
server-addr: 192.168.58.101:8848 # nacos地址
namespace: "" # namespace,默认为空
group: DEFAULT_GROUP # 分组,默认是DEFAULT_GROUP
application: seata-server # seata服务名称
username: nacos
password: nacos
tx-service-group: hmall # 事务组名称
service:
vgroup-mapping: # 事务组与tc集群的映射关系
hmall: "default"
data-source-proxy-mode: XA

事务方法

1
2
3
4
5
6
7
8
9
10
import io.seata.spring.annotation.GlobalTransactional;

@Service
public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements IOrderService {

@GlobalTransactional
public Long createOrder(OrderFormDTO orderFormDTO) {
//具体方法
}
}

在分布式事务,有报错的情况下,回滚事务,效果展示image-20240613185522788

AT模式

AT 模式(也称为 TCC 模式,即 Try-Confirm-Cancel 模式)是一种用于分布式事务处理的解决方案,与传统的 XA 模式不同,它采用了一种乐观锁的方式来实现分布式事务的一致性。

AT 模式的基本概念

  1. Try 阶段
    • 在这个阶段,事务发起方(也称为参与者)尝试预留或者锁定需要的资源,执行业务检查,但是并不实际修改数据库状态或者执行持久化操作。如果所有参与者的 Try 操作都成功,那么整个事务可以继续进行 Confirm 阶段。
  2. Confirm 阶段
    • 在 Confirm 阶段,事务发起方向所有参与者发送确认请求,要求参与者正式执行事务。在这个阶段,参与者会执行真正的业务操作,将事务状态持久化到数据库或者其他持久化存储中。
  3. Cancel 阶段
    • 如果在 Try 阶段中任何一个参与者发生失败,或者事务发起方决定回滚事务,则会触发 Cancel 阶段。在 Cancel 阶段,事务发起方向所有参与者发送取消请求,要求参与者撤销之前的 Try 操作,尽力恢复到事务开始前的状态。

AT 模式的优点

  • 低侵入性:相比较于 XA 模式,AT 模式在代码实现上更加灵活和可控,对业务逻辑的侵入性较低,因为业务逻辑和事务管理逻辑可以相对独立地实现。
  • 高可用性:由于 Try 阶段不会真正改变系统状态,因此可以降低并发冲突和锁竞争,提高系统的并发处理能力和可用性。
  • 分布式支持:适用于分布式系统和微服务架构,可以通过网络通信来协调多个参与者的操作,实现分布式事务的一致性。

AT 模式的实现

实现 AT 模式通常需要以下步骤和组件:

  • 事务管理器(Transaction Manager):负责协调整个事务的执行,包括 Try、Confirm 和 Cancel 阶段的处理逻辑。
  • 分布式锁或乐观锁:用于在 Try 阶段保证资源的预留或者锁定,避免并发冲突。
  • 参与者(Actor):实际执行业务逻辑的组件或者服务,参与到事务的 Try、Confirm 和 Cancel 操作中。

总结

AT 模式是一种轻量级的分布式事务解决方案,适用于需要高可用性和低侵入性的场景。与 XA 模式相比,它更加灵活,并且可以更好地与微服务架构和分布式系统集成。但是需要注意的是,AT 模式需要开发人员显式地处理事务的 Try、Confirm 和 Cancel 阶段,以确保事务的一致性和正确性。

使用

nacos配置管理 shared-seata.yaml添加data-source-proxy-mode: AT

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
seata:
registry: # TC服务注册中心的配置,微服务根据这些信息去注册中心获取tc服务地址
type: nacos # 注册中心类型 nacos
nacos:
server-addr: 192.168.58.101:8848 # nacos地址
namespace: "" # namespace,默认为空
group: DEFAULT_GROUP # 分组,默认是DEFAULT_GROUP
application: seata-server # seata服务名称
username: nacos
password: nacos
tx-service-group: hmall # 事务组名称
service:
vgroup-mapping: # 事务组与tc集群的映射关系
hmall: "default"
data-source-proxy-mode: AT

事务方法

1
2
3
4
5
6
7
8
9
10
import io.seata.spring.annotation.GlobalTransactional;

@Service
public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements IOrderService {

@GlobalTransactional
public Long createOrder(OrderFormDTO orderFormDTO) {
//具体方法
}
}

在分布式事务,有报错的情况下,回滚事务,效果展示

image-20240613185821618