seata实现分布式事务的原理解析

2024-04-15 17:27:29 浏览数 (4)

Seata(Simple Extensible Autonomous Transaction Architecture)是一个开源的分布式事务解决方案,由阿里巴巴和蚂蚁金服共同研发并开源。Seata设计的核心目标是在微服务架构中提供一种对业务代码侵入性较小的方式来处理分布式事务问题,确保多个服务间的操作可以保持原子性和一致性。

Seata 分布式事务的基本原理

Seata通过引入**全局事务**的概念,将一个分布式事务分解为多个局部的分支事务,这些分支事务分布在不同的服务或者数据库中。为了协调这些分支事务,Seata定义了三个关键组件:

1. **Transaction Coordinator (TC)**:

- TC作为全局事务的协调者,它通常以服务的形式独立部署,负责维护全局事务的状态,并根据TM的请求决定全局事务的提交或回滚。

2. **Transaction Manager (TM)**:

- TM嵌入在业务应用中,负责开启全局事务,并在事务结束时根据业务执行的结果发起全局提交或全局回滚的请求给TC。

3. **Resource Manager (RM)**:

- RM代表每个参与到分布式事务的服务或数据库资源,负责分支事务的注册、状态报告以及根据TC的指令执行本地事务的提交或回滚。

Seata 实现分布式事务的关键步骤

1. **全局事务的启动**:

- 应用程序(TM)调用Seata客户端发起全局事务,获取全局唯一的事务ID(XID)。

- XID在跨服务调用过程中通过上下文传播,使得各个微服务都能识别到同一全局事务。

2. **分支事务注册**:

- 每个涉及分布式事务的服务在进行数据库操作前,会将其本地事务注册到TC,并与XID关联起来。

3. **事务执行与数据暂存**:

- 在AT模式下(默认模式),Seata通过代理数据库连接层,在本地事务执行过程中记录SQL操作前后的数据变化,保存为Undo Log和Redo Log,以便后续回滚或重试。

4. **第一阶段(准备阶段)**:

- 所有参与全局事务的分支事务首先尝试执行本地事务,并将准备提交的结果报告给TC。

5. **第二阶段(提交或回滚阶段)**:

- 如果所有分支事务的第一阶段都成功,则TC通知所有RM进行全局提交,RM根据 Undo Log 和 Redo Log 完成最终提交;

- 若有任何分支事务失败,则TC通知所有RM进行全局回滚,RM利用 Undo Log 回滚已变更的数据。

Seata 支持的事务模式

Seata 提供了多种事务模式以适应不同的业务场景,包括但不限于:

- **AT模式(Automatic Transaction Mode)**

- 基于数据库层面的自动补偿机制,通过拦截SQL语句并在数据库中记录回滚日志来达到分布式事务的一致性。

- **TCC模式(Try-Confirm-Cancel)**

- 一种编程模型,要求业务开发人员实现Try(尝试)、Confirm(确认)和Cancel(取消)三个接口方法,以手动编写业务补偿逻辑。

- **Saga模式**

- 面向长事务,通过一系列子事务的正向和逆向操作序列来实现最终一致性。

- **XA模式**

- 传统的两阶段提交协议,适用于支持XA协议的数据库资源管理器。

通过上述机制,Seata能够有效地管理分布式环境下的事务,确保即使在复杂的微服务架构中也能保证事务的ACID特性。

1 人点赞