Seata 的简单使用笔记
Seata 简单使用笔记
Seata 是 Alibaba 开源的分布式事务组件.
分布式事务与本地事务不同, 本地事务是针对单一数据库的操作, 使用 Spring boot 的 @Transactional 注解即可实现, 而分布式事务可能会涉及多个服务多个库, 这就是需要多个服务间的协调.
角色
- TC (Transaction Coordinator) -> 事务协调, 维护事务状态, 是单独的服务
- TM (Transaction Manager) -> 事务管理, 控制事务
- RM (Resource Manager) -> 资源管理, 管理分支事务处理资源, 与 TC 通信, 驱动分支事务
全局事务实现
全局事务实现通常有 2PC (两阶段提交协议) 和 3PC (三阶段提交协议) 两种
2PC
2PC (Two-Phase Commit), 两阶段提交协议包含: Prepare 和 Commit 两个阶段
2PC 有着同步阻塞, 单点故障, 数据一致性的问题
Prepare 阶段
与 TC 通信, TC 与相关参与者通信, 相关参与者进行数据处理并进行响应
Commit 阶段
TC 与相关参与者发送 Commit 或 Rollback 命令, 参与者执行命令并作响应以及释放资源
3PC
3PC 协议较难实现, 主流的分布式事务框架实现的是 2PC 协议
模式
Seata 具有 AT, TCC, SAGA 和 XA 事务模式
AT (Auto Transaction) 常用
AT 模式在数据库本地事务隔离级别是读已提交 (Read Committed) 或以上的基础上, Seata的默认全局隔离级别是读未提交 (Read Uncommitted)
若要求全局事务级别是读已提交, Seata 的实现方式是通过 SELECT FOR UPDATE
SQL 语句的代理
事务前后会生成两张快照, 当接到 TC 发来的回滚指令时, Seata 会根据快照生成逆向 SQL 回滚
机制
- 一阶段: 业务数据和回滚日志记录在同一个本地事务中提交, 释放本地锁和连接资源
- 二阶段:
- 提交异步化, 非常快速地完成
- 回滚通过一阶段的回滚日志进行反向补偿
TCC (Try Confirm Cancel)
TCC 模式, 是指支持把自定义的分支事务纳入到全局事务的管理中, 不依赖于底层数据资源的事务支持
TCC 模式是利用消息队列基于可靠消息的全局事务解决方案
SAGA
业务流程中每个参与者都提交本地事务, 当出现某一个参与者失败则补偿前面已经成功的参与者, 一阶段正向服务和二阶段补偿服务都由业务开发实现. 适合长事务解决方案
XA
XA 模式需要支持 XA 事务的数据库
MySQL 5.0+ 中的 InnoDB 引擎支持XA事务
具体信息可以参考 6 张图带你彻底搞懂分布式事务 XA 模式
角色
- TC: 事务协调者. 维护全局和分支事务的状态, 驱动全局事务的提交和回滚
- TM: 事务管理者. 定义全局事务范围: 开始全局事务, 提交或回滚全局事务. TM 是全局事务的发起者
- RM (Resource Manager): 资源管理器. 管理分支事务处理的资源, 与 TC 通信注册分支事务以及报告分支事务的状态, 驱动分支事务的提交或回滚