Seata简介与事务模式

目录

    • Seata
    • 事务模式
      • AT模式
      • TCC模式
      • Saga 模式
      • XA 模式

Seata

Seata (Simple Extensible Autonomous Transaction Architecture) 是一款开源的分布式事务解决方案,由阿里巴巴集团开源,致力于提供高性能和简单易用的分布式事务服务。在微服务架构下,当业务操作需要跨越多个数据库或者多个服务时,Seata可以帮助我们解决分布式环境下的事务一致性问题。

Seata 将为用户提供了 AT、TCC、SAGA 和 XA 事务模式,为用户打造一站式的分布式解决方案。

Seata 的核心组件:

TC (Transaction Coordinator) - 事务协调者:维护全局和分支事务的状态,驱动全局事务提交或回滚。

TM (Transaction Manager) - 事务管理器:定义全局事务的范围:开始全局事务、提交或回滚全局事务。

RM (Resource Manager) - 资源管理器:管理分支事务处理的资源,与TC交谈以注册分支事务和报告分支事务的状态,并驱动分支事务提交或回滚。

事务模式

AT模式

前提
基于支持本地 ACID 事务的关系型数据库。
Java 应用,通过 JDBC 访问数据库。

AT模式是Seata默认的事务模式,它基于数据库本地事务实现分布式事务。其核心思想是将分布式事务拆分为一个全局事务和多个分支事务,通过全局事务协调器与分支事务管理器协作,保证分布式事务的ACID特性。在业务执行过程中,Seata会对SQL进行解析、重写并生成相应的undo/redo日志,以实现事务的回滚和恢复。

AT模式工作机制

Seata使用日志来管理事务,通过将业务数据和回滚日志记录在同一个本地事务中提交,来确保事务的一致性。

下面是AT模式的整个工作流程

第一阶段提交:在第一阶段,Seata会拦截“业务 SQL”,解析 SQL 语义,找到“业务 SQL”要更新的业务数据。

1、在业务数据被更新前,解析 SQL,得到SQL的条件信息,生成查询语句,定位数据,将其保存成“before image”。
2、执行“业务 SQL”,更新业务数据。
3、在业务数据更新之后,定位数据,再将其保存成“after image”。
4、插入回滚日志:把前后镜像数据以及业务 SQL 相关的信息组成一条回滚日志记录,插入到 UNDO_LOG 表中。
5、提交前,向 TC注册分支,申请 全局锁 。
6、本地事务提交:业务数据的更新和前面步骤中生成的 UNDO LOG 一并提交。
7、将本地事务提交的结果上报给 TC。

以上操作全部在一个数据库事务内完成,这样保证了一阶段操作的原子性。

二阶段-提交
1、收到 TC 的分支提交请求,把请求放入一个异步任务的队列中,马上返回提交成功的结果给 TC。
2、异步任务阶段的分支提交请求将异步和批量地删除相应 UNDO LOG 记录。

二阶段-回滚
1、收到 TC 的分支回滚请求,开启一个本地事务,执行如下操作。
2、通过 XID 和 Branch ID 查找到相应的 UNDO LOG 记录。
3、数据校验:拿 UNDO LOG 中的后镜与当前数据进行比较,如果有不同,说明数据被当前全局事务之外的动作做了修改。这种情况,需要根据配置策略来做处理。
4、根据 UNDO LOG 中的前镜像和业务 SQL 的相关信息生成并执行回滚的语句:
5、提交本地事务。并把本地事务的执行结果(即分支事务回滚的结果)上报给 TC。

TCC模式

TCC模式是一种补偿型事务模式,在TCC模式中,业务逻辑需要分为三个阶段:Try阶段、Confirm阶段和Cancel阶段。

TCC模式需要用户自己编写业务代码实现Try、Confirm和Cancel三个操作,所谓 TCC 模式,是指支持把 自定义 的分支事务纳入到全局事务的管理中。

优势
TCC 完全不依赖底层数据库,能够实现跨数据库、跨应用资源管理,可以提供给业务方更细粒度的控制。

缺点
TCC 是一种侵入式的分布式事务解决方案,需要业务系统自行实现 Try,Confirm,Cancel 三个操作,对业务系统有着非常大的入侵性,设计相对复杂。

适用场景
TCC 模式是高性能分布式事务解决方案,适用于核心系统等对性能有很高要求的场景。

Saga 模式

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

优势:
一阶段提交本地事务,无锁,高性能
事件驱动架构,参与者可异步执行,高吞吐
补偿服务易于实现

缺点:
不保证隔离性

适用场景:
业务流程长、业务流程多
参与者包含其它公司或遗留系统服务,无法提供 TCC 模式要求的三个接口

XA 模式

前提
支持XA 事务的数据库。
Java 应用,通过 JDBC 访问数据库。

XA 模式是从 1.2 版本支持的事务模式。

工作机制如下

执行阶段
可回滚:业务 SQL 操作放在 XA 分支中进行,由资源对 XA 协议的支持来保证 可回滚
持久化:XA 分支完成后,执行 XA prepare,同样,由资源对 XA 协议的支持来保证 持久化(即,之后任何意外都不会造成无法回滚的情况)

完成阶段
分支提交:执行 XA 分支的 commit
分支回滚:执行 XA 分支的 rollback

优势
与 Seata 支持的其它事务模式不同,XA 协议要求事务资源本身提供对规范和协议的支持,所以事务资源(如数据库)可以保障从任意视角对数据的访问有效隔离,满足全局数据一致性。此外的一些优势还包括:

  1. 业务无侵入:和 AT 一样,XA 模式将是业务无侵入的,不给应用设计和开发带来额外负担。
  2. 数据库的支持广泛:XA 协议被主流关系型数据库广泛支持,不需要额外的适配即可使用。

缺点
XA prepare 后,分支事务进入阻塞阶段,收到 XA commit 或 XA rollback 前必须阻塞等待。事务资源长时间得不到释放,锁定周期长,而且在应用层上面无法干预,性能差。

适用场景
适用于想要迁移到 Seata 平台基于 XA 协议的老应用,使用 XA 模式将更平滑,还有 AT 模式未适配的数据库应用。

你可能感兴趣的:(Spring,Cloud,java,spring,cloud,分布式,seata)