《深入理解分布式事务与Seata解决方案》

分布式事务-重要

1.数据库的事务

1、事务概念

事务是一个完整的,不可分割操作单元。

整个事务要么全部执行成功,要么全部执行失败。

事务具备4个特性:ACID

A:原子性【】

C:一致性【数据的一致性:事务开始前和事务结束后,数据总量不变】

I:隔离性【事务相互隔离,互不影响】

D:持久性【事务一旦提交,永久落盘】

2、传统事务是由谁来控制的?

  • 数据库连接

JDBC:Connection对象

Mybatis:SqlSession

Spring:声明式事务

  • 传统事务:只有是同一个Connection操作的数据库才能够控制住
  • 在分布式系统中出现的事务问题

传统事务的弊端:事务无法形成一个整体全局事务,不符合逻辑,如增加购物车出现问题只是回滚了购物车表,但实际已经增加了订单和减少了库存,出现了脏数据,需要一个全局的事务来调动他们三个事务

产生的情况:

  • 业务跨多个服务实现
  • 业务跨多个数据源实现

什么是分布式事务?:是指在分布式系统中,跨越多个节点或服务执行的一系列操作,这些操作必须作为一个整体来处理,要么全部成功,要么全部失败。这样的机制确保了数据的一致性和完整性,即使是在不同的数据库、服务器或者甚至是不同的地理位置上进行操作。

3、Seata

1、大原理


由TC统一调度和就监控整个事务的过程,检测每个分支RM的存在。

2.解决分布式方案

Seata 是一个开源的分布式事务解决方案,旨在提供高性能和简单易用的分布式事务服务。Seata 支持多种分布式事务模式来解决不同场景下的问题。以下是 Seata 中主要支持的几种分布式事务解决方案:

  1. AT 模式 (Automatic Transaction Mode)
    • AT 模式是 Seata 的默认模式,也是最常用的一种。它基于两阶段提交协议,并且对业务无侵入性。在第一阶段,Seata 会自动拦截并记录 SQL 语句,然后生成反向 SQL(用于回滚操作)。如果所有分支事务都成功,则进入第二阶段提交;如果有任何一个失败,则执行反向 SQL 进行回滚。
    • 特点:对应用代码透明,易于集成。
  2. TCC 模式 (Try-Confirm-Cancel)

    • TCC 模式是一种补偿型事务模型。它将业务逻辑分为三个步骤:Try(尝试)、Confirm(确认)和 Cancel(取消)。在 Try 阶段,各个服务预处理数据,但不真正提交;如果所有服务的 Try 成功,则进入 Confirm 阶段,正式提交更改;若任一 Try 失败或系统出错,则进入 Cancel 阶段,撤销之前的操作。
    • 特点:需要开发者实现特定的接口,但提供了更细粒度的控制。
  3. SAGA 模式

    • SAGA 模式通过定义一系列本地事务,每个事务都有对应的补偿动作。这些本地事务按照顺序执行,一旦某个事务失败,那么就依次执行前面已经成功事务的补偿动作,以达到最终的一致性状态。
    • 特点:适用于长流程、复杂业务场景,要求开发者设计好每一步及其补偿逻辑。
  4. XA 模式

    • XA 模式遵循 X/Open XA 分布式事务规范,这是一种传统的分布式事务处理方式。XA 模式使用全局事务管理器来协调参与事务的所有资源管理者,保证事务的原子性和一致性。
    • 特点:兼容性强,但可能带来较高的性能开销。
  5. MT 模式 (Multi-Terminal Transaction)

    • MT 模式是在 Seata 1.3.0 版本引入的新特性,专为微服务架构下多终端交互场景设计。它允许在同一个全局事务中包含多个客户端发起的子事务,适合于用户界面与后台服务间频繁交互的应用场景。

选择哪种模式取决于具体的业务需求、系统的复杂程度以及对一致性的要求等因素。Seata 提供了灵活的配置选项,使得开发者可以根据实际应用场景选择最合适的方式来管理分布式事务。
3、XA模式【强一致性】
最终统一提交或者回滚,注意数据库需要支持这种操作。

  • 优点

    • 事务的强一致性,满足ACID原则
    • 常用数据库都支持,实现简单,并且没有代码侵入
  • 缺点

    • 因为一阶段需要锁定数据库资源,鞥带二阶段结束才释放,性能较差
    • 依赖关系型数据库实现事务

修改shared-seate.yaml切换模式

Nacos

4、AT模式【最终一致性】

这个有些像模块式操作,一个个拼图既是独立的也可以是一个整体,只要求最终一致性中间过程不管。

举例:RM1执行sql后提交数据并在undo-log记录更新快照,这里提交的数据是一个中间状态(软状态)。可能不会是最终的数据。但也写入数据库中。并向TC报告状态(已提交)

RM2执行sql异常,那么回想TC报告异常(已失败),undo-log没有变化,报告事务状态(失败)检查后发现失败,触发TC回滚,这里RM1调用undo-log恢复log数据,恢复完毕后会删除log数据。

AT模式同样是分阶段提交的事务模型,不过缺弥补了XA模型中资源锁定周期过长的缺陷。

阶段一RM的工作:

  • 注册分支事务
  • 记录undo-log(数据快照)
  • 执行业务sql并提交
  • 报告事务状态

阶段二提交时RM的工作:

  • 删除undo-log即可

阶段二回滚时RM的工作:

  • 根据undo-log恢复数据到更新前

5.AT与XA的区别

简述AT模式与XA模式最大的区别是什么?

  • XA模式一阶段不提交事务,锁定资源;AT模式一阶段直接提交,不锁定资源。
  • XA模式依赖数据库机制实现回滚;AT模式利用数据快照实现数据回滚。
  • XA模式强一致;AT模式最终一致

可见,AT模式使用起来更加简单,无业务侵入,性能更好。因此企业90%的分布式事务都可以用AT模式来解决。

posted @   RuSuanJun22310  阅读(27)  评论(0编辑  收藏  举报
(评论功能已被禁用)
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)
点击右上角即可分享
微信分享提示