SpringCloud组件Seata分布式事务
前言:Seata 是一个开源的分布式事务解决方案,旨在提供高性能和易于使用的分布式事务服务。它最初由阿里巴巴开源,现已成为 Linux 基金会旗下的一个项目。Seata 的名字源自于 “Simple Extensible Autonomous Transaction Architecture”,即简单可扩展的自治事务架构。
主要特性
- 高性能:Seata 采用了一系列优化策略,如并行处理、异步提交、分布式锁等,以确保在高并发场景下的高性能表现。
- 简单易用:Seata 提供了丰富的 API 和简洁的配置,使开发者可以快速上手并将其集成到现有系统中。
- 扩展性强:Seata 设计了可插拔的架构,开发者可以根据需要自定义和扩展事务管理策略。
- 多种事务模式:Seata 支持 AT(Automatic Transaction),TCC(Try-Confirm-Cancel),Saga 和 XA 等多种分布式事务模式,以适应不同的应用场景。
核心组件
- **TM (Transaction Manager)**:事务管理器,负责全局事务的生命周期管理,包括事务的开始、提交和回滚。
- **RM (Resource Manager)**:资源管理器,负责本地资源的管理(如数据库),并与 TC 通信,汇报本地事务的状态。
- **TC (Transaction Coordinator)**:事务协调器,负责全局事务的协调与状态维护,确保所有参与者的一致性。
Seata分布式事务
数据库导入
Seata考虑到持久化的需要,一般选择基于数据库存储,创建seata数据库,将sql脚本导入seata数据库
Docker部署
seata配置目录
1 | db: |
seata配置文件夹拷贝至root目录
seata安装包拷贝至root目录
加载镜像文件
1 | docker load -i seata-1.5.2.tar |
启动
1 | docker run --name seata \ |
效果展示
启动后,已经注册到了nacos中
登录
http://部署的服务器IP:7099/ admin admin
Nacos配置Seata
nacos配置管理添加shared-seata.yaml
DateID:shared-seata.yaml
配置格式:YAML
配置内容:
1 | seata: |
项目集成
在需要用到分布式事务的微服务引入seata
1 | <!--seata--> |
XA模式
在分布式事务处理中,XA(eXtended Architecture)是一种标准化的事务管理协议,用于保证多个资源(如数据库、消息队列等)在分布式环境下的事务一致性。XA 协议定义了事务管理器(Transaction Manager)和资源管理器(Resource Manager)之间的通信协议,确保事务的 ACID 特性(原子性、一致性、隔离性、持久性)。
XA 事务的基本概念
- 事务管理器(Transaction Manager):
- XA 事务的协调者,负责协调多个资源管理器之间的事务操作,包括事务的开始(
begin
)、提交(commit
)和回滚(rollback
)等。
- XA 事务的协调者,负责协调多个资源管理器之间的事务操作,包括事务的开始(
- 资源管理器(Resource Manager):
- 实际的数据源或者服务,如数据库管理系统(DBMS)、消息队列等。每个资源管理器都实现了 XA 接口,支持在分布式事务中的协调操作。
- 全局事务:
- 包含多个参与者(资源管理器)的事务,由事务管理器统一管理。全局事务在执行期间必须保证所有参与者的操作要么全部提交成功,要么全部回滚。
XA 事务的工作流程
- 事务的开始(
begin
):- 事务管理器向所有资源管理器发送事务开始请求,要求资源管理器准备好参与全局事务。
- 事务的执行:
- 应用程序通过事务管理器依次操作多个资源管理器,进行读取、更新等操作。
- 事务的提交(
commit
):- 如果所有资源管理器的操作都成功完成,事务管理器发送提交请求,要求所有资源管理器提交其事务。如果有任何一个资源管理器无法提交,则事务管理器会发送回滚请求。
- 事务的回滚(
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 | seata: |
事务方法
1 | import io.seata.spring.annotation.GlobalTransactional; |
在分布式事务,有报错的情况下,回滚事务,效果展示
AT模式
AT 模式(也称为 TCC 模式,即 Try-Confirm-Cancel 模式)是一种用于分布式事务处理的解决方案,与传统的 XA 模式不同,它采用了一种乐观锁的方式来实现分布式事务的一致性。
AT 模式的基本概念
- Try 阶段:
- 在这个阶段,事务发起方(也称为参与者)尝试预留或者锁定需要的资源,执行业务检查,但是并不实际修改数据库状态或者执行持久化操作。如果所有参与者的 Try 操作都成功,那么整个事务可以继续进行 Confirm 阶段。
- Confirm 阶段:
- 在 Confirm 阶段,事务发起方向所有参与者发送确认请求,要求参与者正式执行事务。在这个阶段,参与者会执行真正的业务操作,将事务状态持久化到数据库或者其他持久化存储中。
- 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 | seata: |
事务方法
1 | import io.seata.spring.annotation.GlobalTransactional; |
在分布式事务,有报错的情况下,回滚事务,效果展示