1.SATA AT
Seata AT模式详解
一、AT模式核心原理
Seata的AT模式(Automatic Transaction) 是一种无侵入的分布式事务解决方案,基于改进的两阶段提交(2PC)协议实现。其核心目标是减少业务代码侵入,同时通过本地事务提交与全局锁机制优化性能。
1. 两阶段流程
-
第一阶段(Prepare Phase)
:
-
本地事务提交:业务SQL执行前,Seata通过数据源代理拦截SQL,解析语义并记录前镜像(before image)和后镜像(after image)到
undo_log
表中。 - 全局锁申请:在本地事务提交前,尝试获取记录的全局锁。若获取成功,本地事务提交并释放本地锁;若失败则回滚本地事务 。
-
本地事务提交:业务SQL执行前,Seata通过数据源代理拦截SQL,解析语义并记录前镜像(before image)和后镜像(after image)到
-
第二阶段(Commit/Rollback Phase)
:
-
全局提交:TC通知各分支异步清理
undo_log
,无锁冲突,快速完成。 -
全局回滚:通过
undo_log
中的前镜像生成反向SQL,执行数据补偿 。
-
全局提交:TC通知各分支异步清理
2. 关键组件协作
- TC(事务协调器):独立部署,维护全局事务状态,驱动提交或回滚。
-
TM(事务管理器):定义全局事务边界(通过
@GlobalTransactional
注解)。 - RM(资源管理器):管理分支事务资源,生成回滚日志并与TC通信 。
二、AT模式核心机制
1. 数据镜像与回滚
-
镜像生成:RM拦截业务SQL,记录数据修改前后的快照(
before_image
和after_image
),存储到undo_log
表中,用于异常回滚 。 - 全局锁隔离:通过全局锁实现写隔离,避免多个全局事务同时修改同一数据。例如,事务A持有某记录的全局锁时,事务B需等待锁释放后才能提交 。
2. 事务隔离性
- 写隔离:基于全局锁机制,确保同一记录仅一个全局事务可修改。
-
读隔离:默认读未提交(Read Uncommitted),通过
SELECT FOR UPDATE
可升级为读已提交(Read Committed)。
三、AT模式优缺点分析
优势
-
零侵入性:无需业务代码改造,仅需添加
@GlobalTransactional
注解 。 - 高性能:第一阶段释放本地锁和连接资源,减少资源占用时间,支持高并发 。
- 简化开发:自动生成回滚日志,开发者无需手动处理补偿逻辑 。
局限性
- 数据库限制:仅支持ACID关系型数据库(如MySQL、Oracle)。
- SQL兼容性:部分复杂SQL(如存储过程)无法解析,需结合TCC模式实现 。
四、与TCC模式对比
对比项 | AT模式 | TCC模式 |
---|---|---|
侵入性 | 无侵入,自动生成回滚日志 | 需业务编码实现Try/Confirm/Cancel接口 |
性能 | 高(本地事务快速提交) | 较高(需多次RPC调用) |
适用场景 | 常规数据库操作 | 跨服务、跨语言或非数据库操作 |
锁机制 | 全局锁 | 无锁,通过资源预留实现 |
五、Spring Cloud集成示例
-
依赖配置
:
<!-- Seata客户端依赖 --> <dependency> <groupId>io.seata</groupId> <artifactId>seata-spring-boot-starter</artifactId> </dependency>
2. **数据源代理**:
```java
@Configuration
public class DataSourceConfig {
@Bean
public DataSource dataSource(DataSource druidDataSource) {
return new DataSourceProxy(druidDataSource);
}
}
-
全局事务注解
:
@Service public class OrderService { @GlobalTransactional public void createOrder() { // 调用库存服务、账户服务等 } }
4. **`undo_log`表结构**:
```sql
CREATE TABLE `undo_log` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`branch_id` BIGINT NOT NULL,
`xid` VARCHAR(100) NOT NULL,
`rollback_info` LONGBLOB NOT NULL,
PRIMARY KEY (`id`)
);
六、总结
Seata的AT模式通过自动生成回滚日志和全局锁机制,在保证数据一致性的同时极大简化了开发。其适用于大多数基于关系型数据库的微服务场景,但对非SQL操作或复杂业务逻辑需结合TCC模式使用。实际应用中,需注意SQL兼容性及全局锁可能引发的性能瓶颈 。