在微服务架构盛行的今天,系统被拆解成多个独立服务,每个服务对应独立的数据库。这种“服务自治”的设计虽然提高了系统可维护性和扩展性,却带来了新的难题——分布式事务一致性问题。为了保障跨服务、跨库操作的原子性,阿里巴巴开源了一个优秀的解决方案:Seata(Simple Extensible Autonomous Transaction Architecture)。
本文将从背景动因、整体架构、核心原理、事务模型(AT 模式)、底层机制(如 undo_log、SQL 解析)、并发一致性保障机制、优缺点及使用建议等多个方面,全面解析 Seata 的原理与实现。
我们从一个实际业务场景切入:
假设一个用户在某电商平台下单购买商品,整个下单过程涉及以下三个服务:
在单体应用中,三者共用一个数据库,可以通过本地事务机制(JDBC/Spring事务)实现原子操作。但当服务拆分为三个独立模块,使用三个数据库时:
这就是**分布式事务(Distributed Transaction)**问题的根源。
Seata 是阿里巴巴开源的一个分布式事务解决方案,目标是在微服务架构下提供:
适用于:
Seata 通过引入事务协调者角色,实现多个服务、多个数据库操作之间的一致性控制,确保“要么都成功,要么都失败”。
Seata 的整体架构由以下三个角色组成:
角色 | 说明 |
---|---|
TM(Transaction Manager)事务管理器 | 定义全局事务的边界,负责发起全局事务、提交、回滚 |
TC(Transaction Coordinator)事务协调者 | Seata Server,负责协调全局事务的状态和命令转发 |
RM(Resource Manager)资源管理器 | 各子服务中执行实际数据库操作的模块,负责注册分支事务、执行提交/回滚 |
客户端发起请求
↓
TM(定义全局事务 @GlobalTransactional)
↓
TC ← → 所有 RM(订单/积分/库存)
↓
控制事务生命周期(注册、提交、回滚)
AT(Automatic Transaction)模式是 Seata 默认且推荐的模式,基于**本地事务 + 回滚日志(undo_log)**实现自动补偿。
关键特性:
以下以下单业务为例,用户调用 createOrder()
方法,该方法涉及三个服务:
@GlobalTransactional
public void createOrder(...) {
orderService.create(); // 远程调用
pointService.addPoint(); // 远程调用
stockService.reduce(); // 远程调用
}
@GlobalTransactional
注解标识当前方法为全局事务 TM 的入口各服务方法内部:
@Transactional
public void create() {
// 本地数据库写入订单
}
@Transactional
标记本地事务(Spring事务)每个服务执行完成后向 TC 上报“处理完成”。
CREATE TABLE undo_log (
id BIGINT AUTO_INCREMENT,
branch_id BIGINT NOT NULL,
xid VARCHAR(100) NOT NULL,
rollback_info LONGBLOB NOT NULL,
log_status INT NOT NULL,
log_created DATETIME,
log_modified DATETIME,
...
);
假设下单服务执行了如下 SQL:
INSERT INTO t_order(id, ...) VALUES (1, ...);
执行时:
t_order
若全局事务失败:
DELETE FROM t_order WHERE id = 1;
完成自动数据回滚。
UPDATE t_point SET score = 50 WHERE id = 1001;
记录 undo_log:
UPDATE t_point SET score = 40 WHERE id = 1001;
DELETE FROM t_coupon WHERE id = 999;
记录反向语句:
INSERT INTO t_coupon(id, ...) VALUES (999, ...);
在高并发场景下,多个事务操作同一条数据时,可能出现以下问题:
两个事务同时修改同一条记录,后执行的事务覆盖前者。
解决方案:Seata 自动通过分布式锁机制解决
一个事务未提交的修改,被另一个事务读取,导致读取“脏”数据。
解决方案:
FOR UPDATE
SELECT * FROM t_order WHERE id=1 FOR UPDATE;
Seata 的分布式事务最终依赖于本地数据库的事务隔离级别,因此建议:
@GlobalTransactional
即可启用Seata 通过 TM-TC-RM 三者协作、基于两阶段提交协议,成功实现了微服务下的分布式事务解决方案。AT 模式结合 Undo Log 的设计,实现了“高可靠 + 低入侵 + 自动补偿”。
实战建议: