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 回滚

机制

  1. 一阶段: 业务数据和回滚日志记录在同一个本地事务中提交, 释放本地锁和连接资源
  2. 二阶段:
    • 提交异步化, 非常快速地完成
    • 回滚通过一阶段的回滚日志进行反向补偿

TCC (Try Confirm Cancel)

TCC 模式, 是指支持把自定义的分支事务纳入到全局事务的管理中, 不依赖于底层数据资源的事务支持
TCC 模式是利用消息队列基于可靠消息的全局事务解决方案

SAGA

业务流程中每个参与者都提交本地事务, 当出现某一个参与者失败则补偿前面已经成功的参与者, 一阶段正向服务和二阶段补偿服务都由业务开发实现. 适合长事务解决方案

XA

XA 模式需要支持 XA 事务的数据库
MySQL 5.0+ 中的 InnoDB 引擎支持XA事务
具体信息可以参考 6 张图带你彻底搞懂分布式事务 XA 模式

角色

  • TC: 事务协调者. 维护全局和分支事务的状态, 驱动全局事务的提交和回滚
  • TM: 事务管理者. 定义全局事务范围: 开始全局事务, 提交或回滚全局事务. TM 是全局事务的发起者
  • RM (Resource Manager): 资源管理器. 管理分支事务处理的资源, 与 TC 通信注册分支事务以及报告分支事务的状态, 驱动分支事务的提交或回滚

部署