Spring Boot 作为主流微服务框架,拥有成熟的社区生态。市场应用广泛,为了方便大家,整理了一个基于spring boot的常用中间件快速集成入门系列手册,涉及RPC、缓存、消息队列、分库分表、注册中心、分布式配置等常用开源组件,大概有几十篇文章,陆续会开放出来,感兴趣同学请提前关注&收藏
事务的原子性和持久性可以确保在一个事务内,更新多条数据,要么都成功,要么都失败。在一个系统内部,我们可以使用数据库事务来保证数据一致性。那如果一笔交易,涉及到跨多个系统、多个数据库的时候,用单一的数据库事务就没办法解决了。
此时需要引入分布式事务,关于分布式事务市面上有很多解决方案,之前写过一篇文章 如何解决分布式事务,感兴趣的同学可以看看。
本文着重讲下阿里的开源框架 -- Seata,目前在github上已经有2万 star了,非常受欢迎!!!
Seata 框架介绍
Seata 是一款开源的分布式事务解决方案,致力于提供高性能和简单易用的分布式事务服务。Seata 将为用户提供了 AT、TCC、SAGA 和 XA 事务模式,为用户打造一站式的分布式解决方案。
优点:
-
对业务无侵入:即减少技术架构上的微服务化所带来的分布式事务问题对业务的侵入
-
高性能:减少分布式事务解决方案所带来的性能消耗
AT模式整体机制:
-
一阶段:业务数据和回滚日志记录在同一个本地事务中提交,释放本地锁和连接资源。
-
二阶段:
-
提交异步化,自动异步批量清理回滚日志。
-
通过回滚日志,自动生成补偿操作,完成数据回滚。
-
核心原理:
Seata 的 JDBC 数据源代理通过对业务 SQL 的解析,把业务数据在更新前后的数据镜像组织成回滚日志,利用本地事务
的 ACID 特性,将业务数据的更新和回滚日志的写入在同一个本地事务
中提交。
这样可以保证,任何提交的业务数据的更新一定有相应的回滚日志存在。
如果 TC 决议要全局回滚,会通知 RM 进行回滚操作,通过 XID 找到对应的回滚日志记录,通过回滚记录生成反向更新 SQL,进行更新回滚操作。
TCC 模式,不依赖于底层数据资源的事务支持:
-
一阶段 prepare 行为:调用 自定义 的 prepare 逻辑。
-
二阶段 commit 行为:调用 自定义 的 commit 逻辑。
-
二阶段 rollback 行为:调用 自定义 的 rollback 逻辑。
所谓 TCC 模式,是指支持把 自定义 的分支事务纳入到全局事务的管理中。
Seata 流程
Seata有3个基本组成部分:
-
事务协调器(TC):维护全局事务和分支事务的状态,驱动全局提交或回滚。
-
事务管理器(TM):定义全局事务的范围:开始全局事务,提交或回滚全局事务。
-
资源管理器(RM):管理正在处理的分支事务的资源,与TC对话以注册分支事务并报告分支事务的状态,并驱动分支事务的提交或回滚。
整个事务流程:
-
TM 向 TC 申请开启一个全局事务,全局事务创建成功并生成一个全局唯一的 XID
-
XID 在微服务调用链路的上下文中传播
-
RM 向 TC 注册分支事务,将其纳入 XID 对应全局事务的管辖
-
TM 向 TC 发起针对 XID 的全局提交或回滚决议
-
TC 调度 XID 下管辖的全部分支事务完成提交或回滚请求。
示例Demo演示
采用Docker模式,安装Seata Server
拉取镜像: