问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

什么是 Seata? Seata 支持哪些模式的分布式事务?

创作时间:
作者:
@小白创作中心

什么是 Seata? Seata 支持哪些模式的分布式事务?

引用
CSDN
1.
https://blog.csdn.net/weixin_73093777/article/details/146312666

概念

Seata 是一款阿里开源的分布式事务解决方案,其主要是为了解决分布式系统中全局事务的一致性问题。因为在分布式系统中,由于一次操作可能出现需要多个数据库一起查询,或者需要多个服务之间实现远程调用,这样的话就容易出现数据不一致的问题。分布式事务就是为了解决这个问题,而 Seata 就是一个解决这种问题的方案。

Seata 的主要特点就是无侵入性以及高性能,它对于业务代码的无侵入,可以减少微服务架构所带来的分布式事务问题,并且其可以减少分布式事务解决方案所带来的性能消耗。

Seata对分布式事务的协调和控制就是 1+3

1个XID
XID是全局事务的唯一标识,它可以在服务的调用链路中传递,绑定到服务的事务上下文中

3个概念

  • TC 事务协调器
    就是Seata,负责维护全局事务和分支事务的状态,驱动全局事务提交或回滚,它会对所有的分支事务进行注册,然后根据各个分支事务的状态来决定整体事务是否提交以及回滚。
  • TM事务管理器
    标注全局
    @GlobalTransactional
    启动入口动作的微服务模块(比如订单模块),它是事务的发起者,负责定义全局事务的范围,并根据 TC 维护的全局事务和分支事务状态,做出开始事务、提交事务、回滚事务的决议
  • RM资源管理器
    主要负责管理分支事务上的资源管理,可以对应多个数据库,多个RM,向TC注册分支事务,汇报分支事务状态,驱动分支事务的提交或回滚

核心

  • Order微服务TC发起订单===>根据代码顺序先后调用其余两个微服务====>其余两个微服务各自实现自身的增删改查和业务
  • 数据库操作以及分布式事务和一致性问题交给Seata(TC)实现
  • undo_log表负责记录Seata事务处理信息

事务模式

eata 目前支持四种事务模式,分别是 AT、TCC、Saga 以及 XA 模式

  • AT 模式: 通过代理数据库操作来实现分布式事务管理。Seata 在业务操作前后自动生成回滚日志,在提交时直接提交本地事务,在回滚时利用日志进行数据的还原。
  • TCC 模式: 是一种两阶段提交。将一个操作拆分为三个步骤: Try(预留资源)、Confirm(确认操作)、Cancel(回滚操作)。开发者需要自己实现每个步骤的逻辑。
  • Saga 模式: 是一种长事务模式,它将全局事务拆解为多个有序的小事务,每个事务都有对应的补偿操作。若某个事务失败,按照相反的顺序依次调用补偿操作
  • XA 模式: 是基于两阶段提交协议(2PC)的标准化分布式事务管理模式。通过协调多个资源管理器的事务提交和回滚来实现全局事务的管理

AT模式

AT模式采用了一种称为全局锁(Global Lock)的机制来实现事务的隔离性。这个全局锁并不是传统意义上的分布式锁,而是一种更贴近业务数据的逻辑锁。特点是乐观锁和悲观锁

AT 模式是一种无侵入的分布式事务解决方案。在 AT 模式下,用户只需关注自己的“业务 SQL”,用户的 “业务 SQL” 作为一阶段,Seata 框架会自动生成事务的二阶段提交和回滚操作

通过全局事务
xid
进行管控,自己的分支事务
branchId
进行协调 ,模式采用
branchType=AT

  • 一阶段

  • 业务数据和回滚日志在同一个本地事务中提交,释放本地锁和连接资源

  • 在一阶段,Seata 会拦截“业务 SQL”,

    1. 解析 SQL 语义,找到“业务 SQL”要更新的业务数据,在业务数据被更新前,将其保存成“before image”,即原始数据
    2. 执行“业务 SQL”更新业务数据,在业务数据更新之后
    3. 其保存成“after image”,即修改数据库后的数据,最后生成行锁
      以上操作全部在一个数据库事务内完成,这样保证了一阶段操作的原子性。
  • 二阶段

  • 正常提交:

  • 因为数据库操作没有异常,无需回滚

  • “业务 SQL”在一阶段已经提交至数据库,所以Seata框架只需将一阶段保存的undo_log快照数据和行锁删掉,完成数据清理即可

  • 异常情况 需回滚

  • 回滚方式是用“before image”还原业务数据

  • 还原前要首先要校验脏写,对比“数据库当前业务数据”和 “after image”,如果两份数据完全一致就说明没有脏写,可以还原业务数据,如果不一致就说明有脏写,出现脏写就需要转人工处理

  • 脏写(Dirty Write)是数据库并发控制中的一个术语,指的是当一个事务(我们可以称之为事务A)覆写了另一个并发事务(称之为事务B)尚未提交的数据时发生的情况。

TCC 模式

CC 模式是一种基于补偿机制的分布式事务模式,其全名叫做 Try-Comfirm-Cancel,是二阶段提交协议。

TCC分为指代 Try、Confirm、Cancel,也就是业务层面需要写对应的三个方法,主要用于跨数据库、跨服务的业务操作的数据一致性问题。

TCC 分为两个阶段,第一阶段是资源检查预留阶段即 Try,第二阶段是提交或回滚,如果是提交的话就是执行真正的业务操作,如果是回滚则是执行预留资源的取消,恢复初始状态。

Saga 模式

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


XA模式

基于两阶段提交协议(2PC),能够保证全局事务的强一致性。TC 作为协调者管理各个参与者的提交和回滚操作,但这种模式性能较低,适合对一致性要求严格的场景。

执行阶段:

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

完成阶段:

  • 分支提交: 执行 XA 分支的 commit
  • 分支回滚: 执行 XA 分支的 rollback
© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号