引言
微服务架构下,一个业务操作可能跨越多个服务和数据库实例,如何保证这些跨服务操作的一致性,是分布式系统设计的核心难题。本文系统梳理六种分布式事务解决方案,并以Seata AT模式为案例深入实战。
1. CAP定理与事务本质
CAP定理告诉我们,分布式系统无法同时满足一致性(Consistency)、可用性(Availability)和分区容错(Partition Tolerance)。实践中,我们通常:
- 选择AP系统:放弃强一致,拥抱最终一致(大多数互联网场景)
- 选择CP系统:放弃可用,保证强一致(金融、库存等)
- BASE理论:基本可用(Basically Available)、软状态(Soft state)、最终一致性(Eventual consistency)
分布式事务的本质是在"一致性"和"可用性"之间做权衡,不同业务场景需要不同的权衡。
2. 六种分布式事务解决方案
方案一:XA协议(2PC/Two-Phase Commit)
- TC(Transaction Coordinator):维护全局事务和分支事务的状态,驱动全局提交或回滚。独立部署。
- TM(Transaction Manager):定义全局事务的范围,开启/提交/回滚全局事务。嵌入业务服务。
- RM(Resource Manager):管理分支事务的资源,向TC注册和报告分支事务。嵌入数据源(自动代理)。
- SQL拦截器解析SQL语义,识别业务SQL前后镜像(before/after image)
- 创建undo_log记录,保存反向擦除信息(JSON格式存储在业务的undo_log表中)
- 执行本地事务(local commit)并提交
- 注册Branch Transaction,报告执行状态到TC
- 全局提交:各RM异步删除undo_log(清理)
- 全局回滚:执行反向补偿(Reverse SQLGenerator):INSERT↔DELETE,UPDATE↔反向UPDATE,基于Undo Log生成补偿SQL
- 回滚隔离:通过Global Read Committed保证读取时不被未提交事务干扰
优点:强一致性;缺点:同步阻塞、单点故障、数据不一致窗口(第二阶段)等。传统关系型数据库(MySQL/PostgreSQL)内置支持,但不适合高并发微服务架构。
方案二:TCC(Try-Confirm-Cancel)
优点:性能极高(无锁/无全局锁);缺点:实现复杂、需要Try阶段预留资源、Cancel阶段的业务设计。
方案三: Saga模式
优点:事件驱动无锁、适合长事务;缺点:实现复杂度中(需设计补偿)、隔离性差、调试困难。
方案四:本地消息表(Local Message Table)
优点:最终一致、去中心化、灵活性高;缺点:消息冗余、业务侵入性。
方案五:事务消息(Transaction Message - RocketMQ/Kafka)
适用领域广泛,依赖消息中间件的半消息特性。RocketMQ事务消息通过两阶段消息提交+回查机制实现最终一致。
方案六:Seata AT模式(Automatic Transaction)
优点:零业务侵入、自动补偿、社区活跃;缺点:引入SDK耦合、依赖全局读已提交隔离级别。
3. Seata架构与核心组件
Seata(Simple Extensible Autonomous Transaction Architecture)包含三个核心角色:
4. Seata AT模式原理
AT模式的核心思想是"先提交后补偿":
第一阶段(Execute):
第二阶段(Commit/Rollback):
5. Seata生产实践关键配置
全局锁与并发控制:
- useGlobalLock:是否向TC询问全局锁默认开启,热点数据可能成为瓶颈
- globalLockRetryInterval/RetryTimes:全局锁重试间隔和次数
数据源代理:
- datasourceProxyMode:支持Druid/HikariCP/KikariCP等主流连接池
Undo Log管理:
- undoLogSerialization:序列化方式(kryo/jackson),kryo更紧凑
- undoLogTable:表名可自定义
- 仅undo_log表需要配置在MySQL中(AT模式必需)
6. Saga模式在Seata中的实现
Seata也支持Saga模式(State Machine引擎):
- 通过JSON定义业务流程状态机
- 支持选择、并行、子流程、异步调用和补偿节点
- 正向服务与补偿服务必须幂等
- 支持调试/重试/恢复等高级功能
7. 选型建议
适合AT模式的场景:处理唯一约束、低并发OLTP、短期线上业务、海外账务背景。
不适合AT模式的场景:高并发热点更新(需要全局锁)、高频Cross-DB操作、需要Read Committed隔离级别的复杂业务。
总结
分布式事务没有银弹。从XA到TCC到Seata AT,每种方案都在一致性、可用性和复杂度之间做出权衡。选择方案时需根据实际业务特征(并发量、一致性需求、隔离级别)权衡取舍,而非盲目跟随技术潮流。Seata AT在通用性和易用性上找到了良好平衡,是多数互联网中后台系统的合理选择。

发表评论 取消回复