202524 | 分布式事务

news2025/5/28 11:11:24

分布式事务(Distributed Transaction)

分布式事务是指跨多个数据库、服务或系统节点的事务操作,要求所有参与方要么全部成功提交,要么全部回滚,保证数据一致性。


1. 为什么需要分布式事务?

在单体应用中,事务可以通过数据库的 ACID(原子性、一致性、隔离性、持久性)保证。但在微服务或分布式系统中:

  • 数据分散:不同服务使用不同的数据库(如订单库、库存库、支付库)。
  • 网络不可靠:跨服务调用可能失败(如支付成功但库存扣减失败)。
  • 业务复杂:多个服务需要协同完成一个业务(如电商下单 → 支付 → 库存扣减)。

示例场景

用户下单
订单服务
支付服务
库存服务
  • 问题:如果支付成功但库存扣减失败,数据不一致!

2. 分布式事务的挑战(CAP理论)

在分布式系统中,无法同时满足:

  • 一致性(Consistency):所有节点数据一致。
  • 可用性(Availability):服务总能响应。
  • 分区容错性(Partition Tolerance):网络分区时仍能运行。

分布式系统必须选择 CP(强一致性)或 AP(高可用性)


分布式事务的解决方案

分布式事务解决方案终极详解

一、核心问题与挑战

在分布式系统中,事务需要跨多个服务或数据库,面临三大核心问题:

  1. 原子性破坏:部分操作成功,部分失败
  2. 数据不一致:网络延迟或故障导致状态不一致
  3. 性能瓶颈:同步阻塞降低系统吞吐量
分布式事务问题
原子性
一致性
性能
部分提交问题
中间状态可见
同步等待
二、强一致性方案详解
1. 2PC(两阶段提交)

核心思想:通过协调者统一调度

协调者 参与者1 参与者2 准备请求(PREPARE) 准备请求(PREPARE) 投票结果(YES/NO) 投票结果(YES/NO) 提交命令(COMMIT) 提交命令(COMMIT) 回滚命令(ROLLBACK) 回滚命令(ROLLBACK) alt [全票通过] [任意拒绝] 协调者 参与者1 参与者2

关键问题

  • 同步阻塞:所有参与者在准备阶段锁定资源
  • 单点故障:协调者宕机导致系统僵死
  • 数据不一致:网络分区时可能部分提交

优化方案

2PC缺陷
协调者集群
超时机制
日志持久化

2. Seata AT模式

架构原理

注册分支事务
生成逆向SQL
Transaction Coordinator
Resource Manager 1
Resource Manager 2

执行流程

  1. 一阶段
    • 解析业务SQL生成前后镜像
    • 本地提交并上报TC
  2. 二阶段
    • 成功:异步删除快照
    • 失败:用前镜像回滚

全局锁机制

获取锁
等待锁
事务1
数据行
事务2

三、最终一致性方案详解
1. TCC模式

三阶段操作

库存服务
订单服务
资源预留
预留取消
实际扣减
释放预留
确认订单
Confirm
取消订单
Cancel
Try

异常处理设计

应用 事务管理器 订单服务 库存服务 开始全局事务 Try 预留成功 Try 预留失败 Cancel Cancel 应用 事务管理器 订单服务 库存服务

注意事项

  • 必须实现幂等性
  • 需要空回滚和防悬挂处理
  • 业务侵入性强

2. Saga模式

两种实现方式对比

55% 45% Saga实现方式 事件编排 命令编排

事件编排示例

成功
失败
失败
订单创建
支付扣款
库存扣减
支付退款
库存补偿

补偿机制设计

正向操作
记录补偿日志
失败时读取日志
执行补偿操作

3. 本地消息表

完整架构

业务操作
写事务表
事务日志
定时任务
消息队列
消费者
业务处理
更新状态

可靠性保障

Producer 数据库 消息队列 Consumer 业务数据+消息(同事务) 发送未处理消息 loop [定时扫描] 消费消息 确认处理完成 Producer 数据库 消息队列 Consumer

四、方案选型矩阵**
维度2PCTCCSaga本地消息表Seata AT
一致性强一致最终一致最终一致最终一致强一致
性能中高
侵入性
复杂度
适用场景金融支付电商秒杀长事务日志同步微服务
选型决策
强一致性要求?
2PC/Seata AT
高并发需求?
TCC
Saga/消息表

Seata

一、Seata 核心架构
注册/上报
分支事务管理
分支事务管理
发起全局事务
本地事务执行
本地事务执行
Transaction Coordinator
Transaction Manager
Resource Manager 1
Resource Manager 2
应用程序
数据库1
数据库2

核心组件

  1. TC (Transaction Coordinator)
    • 事务协调器(独立部署)
    • 维护全局事务状态,驱动分支事务提交/回滚
  2. TM (Transaction Manager)
    • 集成在应用中
    • 定义事务边界,发起全局提交/回滚
  3. RM (Resource Manager)
    • 管理分支事务,向TC注册分支状态
    • 生成SQL镜像,实现数据回滚

二、Seata 的四种模式对比
模式一致性性能侵入性适用场景
AT强一致常规微服务
TCC最终极高高并发(如秒杀)
Saga最终长事务流程
XA强一致传统数据库兼容

三、AT 模式详解(默认模式)

image-20250405082012305

1. 执行流程
应用 TM TC RM 数据库 @GlobalTransactional 开启全局事务(XID) 返回XID 执行SQL 更新数据 注册分支事务 生成undo_log(前后镜像) loop [业务逻辑] 全局提交 异步删除undo_log 全局回滚 根据undo_log回滚 alt [全部成功] [任意失败] 应用 TM TC RM 数据库
2. 核心机制
  • 全局锁:防止脏写
    获取行锁
    阻塞等待
    事务1
    数据行
    事务2
  • undo_log表
    CREATE TABLE `undo_log` (
      `id` bigint(20) NOT NULL AUTO_INCREMENT,
      `branch_id` bigint(20) NOT NULL,
      `xid` varchar(100) NOT NULL,
      `context` varchar(128) NOT NULL,
      `rollback_info` longblob NOT NULL,
      `log_status` int(11) NOT NULL,
      PRIMARY KEY (`id`)
    );
    
3. 适用场景
  • 80%的常规分布式事务场景
  • 支持MySQL、Oracle等主流数据库

四、TCC 模式详解
1. 三阶段操作
库存服务
订单服务
预留资源
取消预留
实际扣减库存
释放冻结库存
订单状态:已支付
Confirm
订单状态:已取消
Cancel
Try
2. 异常处理设计
应用 TM 订单服务 库存服务 开始TCC事务 Try(冻结订单) 成功 Try(冻结库存) 失败 Cancel(解冻订单) Cancel(解冻库存) 应用 TM 订单服务 库存服务
3. 注意事项
  • 必须实现幂等性
  • 需要处理空回滚和防悬挂
  • 典型业务代码:
    @LocalTCC
    public interface OrderTccService {
        @TwoPhaseBusinessAction(name = "createOrder", commitMethod = "confirm", rollbackMethod = "cancel")
        boolean tryCreateOrder(Order order);
        
        boolean confirm(Order order);
        
        boolean cancel(Order order);
    }
    

五、Saga 模式详解
1. 状态机设计
成功
失败
成功
失败
订单创建
支付中
已支付
支付失败
库存扣减
已发货
库存不足
退款处理
订单关闭
2. 补偿机制
正向操作
记录执行日志
失败时触发补偿
读取日志逆向操作
3. 适用场景
  • 跨多服务的业务流程(如电商下单→支付→物流)
  • 每个步骤都需要显式定义补偿操作

六、XA 模式详解
1. 传统XA协议增强
应用 TC RM 数据库 开启XA事务 注册分支 XA START 执行SQL XA END XA PREPARE XA COMMIT XA ROLLBACK alt [全部成功] [任意失败] 应用 TC RM 数据库
2. 特点
  • 完全兼容传统XA协议
  • 需要数据库支持XA(MySQL 5.7+)

七、Seata 生产实践
1. 部署架构
应用1
TC集群
应用2
注册中心
配置中心
存储模式
2. 高可用配置
# registry.conf
registry {
  type = "nacos"
  nacos {
    serverAddr = "127.0.0.1:8848"
    namespace = ""
    cluster = "default"
  }
}

store {
  mode = "db"
  db {
    datasource = "druid"
    url = "jdbc:mysql://127.0.0.1:3306/seata"
    user = "root"
    password = "123456"
  }
}
3. 性能调优
# 调整TC处理线程数
server.max.commit.retry.timeout=60000
server.max.rollback.retry.timeout=60000
store.db.global.table=global_table
store.db.branch.table=branch_table

八、Seata 与同类方案对比
特性SeataDTXShardingSphere
AT模式✔️✖️✖️
TCC支持✔️✔️✖️
Saga支持✔️✖️✔️
XA支持✔️✔️✔️
无侵入AT/XA✖️✖️

九、最佳实践建议
  1. 常规业务:优先使用AT模式
  2. 高并发场景:TCC + 异步Confirm
  3. 长业务流程:Saga状态机 + 可视化监控
  4. 传统系统改造:XA模式

如果需要 具体场景的完整代码示例(如电商下单的AT模式实现),可以告诉我具体需求!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2336257.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

在 macOS 上修改 最大文件描述符限制(Too many open files) 和 网络端口相关参数 需要调整系统级配置的详细步骤

在 macOS 上修改 最大文件描述符限制(Too many open files) 和 网络端口相关参数 需要调整系统级配置。以下是详细步骤: 在 macOS 上修改 最大文件描述符限制(Too many open files) 和 网络端口相关参数 需要调整系统级…

通过Arduino IDE向闪存文件系统上传文件

注意:适用于Arduino IDE 2.0版本以上。对于Arduino IDE版本在2.0以下的请参考太极创客的教程:http://www.taichi-maker.com/homepage/esp8266-nodemcu-iot/iot-c/spiffs/upload-files/。 1. 下载脚本文件 下载地址:https://github.com/earl…

leetcode 121. Best Time to Buy and Sell Stock

题目描述 本题属于动态规划类问题。 dp数组的含义 dp[i][0]表示从第0天到第i天为止,处于持有股票的状态下,账户里的最大金额。 dp[i][1]表示从第0天到第i天为止,处于不持有股票的状态下,账户里的最大金额。 按照这个定义dp[n-…

【Docker-13】Docker Container容器

Docker Container(容器) 一、什么是容器? 通俗地讲,容器是镜像的运行实体。镜像是静态的只读文件,而容器带有运行时需要的可写文件层,并且容器中的进程属于运行状态。即容器运行着真正的应用进程。容器有…

蓝宝石狼组织升级攻击工具包,利用新型紫水晶窃密软件瞄准能源企业

网络安全专家发现,被称为"蓝宝石狼"(Sapphire Werewolf)的威胁组织正在使用升级版"紫水晶"(Amethyst)窃密软件,对能源行业企业发起复杂攻击活动。此次攻击标志着该组织能力显著提升&am…

关于我的服务器

最近我买了台腾讯云服务器,然后新手小白只会用宝塔。。。 安装完之后默认的端口是8888,打开面板就会提示我有风险。然后 我改了端口之后,怎么都打不开。 于是 学到了几句命令可以使用: //查看端口是否已经修改成功 cat www/se…

vue + element-plus自定义表单验证(修改密码业务)

写一个vue组件Password.vue 没有表单验证只有3个表单项 <template><div><el-form><el-form-item label"旧密码"><el-input></el-input></el-form-item><el-form-item label"新密码"><el-input>&l…

2025年第十八届“认证杯”数学中国数学建模网络挑战赛【BC题】完整版+代码+结果

# 问题一&#xff1a;随机森林回归from sklearn.ensemble import RandomForestRegressormodel_rf RandomForestRegressor()model_rf.fit(X_train, y_train)# 问题二&#xff1a;LSTM时间序列预测from tensorflow.keras.models import Sequentialmodel_lstm Sequential()model…

一、小白如何用Pygame制作一款跑酷类游戏(成品展示+添加背景图和道路移动效果)

小白如何用Pygame制作一款跑酷类游戏 文章目录 小白如何用Pygame制作一款跑酷类游戏前言一、游戏最终效果展示二、创建项目并加载pygame模块1.创建项目2.下载pygame模块3. 项目结构安排 三、添加背景图和实现道路移动效果1.引入库2.窗口设置和资源加载3.游戏主循环和程序入口4.…

基础知识:Dify 安装

官方指南:https://docs.dify.ai/zh-hans/getting-started/install-self-hosted docker & docker-compose 安装 可参考:

JWT令牌:实现安全会话跟踪与登录认证的利器

摘要&#xff1a;本文深入探讨了JWT令牌在实现会话跟踪和登录认证方面的应用&#xff0c;详细介绍了JWT令牌的概念、组成、生成与校验方法&#xff0c;以及在实际案例中如何通过JWT令牌进行会话跟踪和登录认证的具体实现步骤&#xff0c;为系统的安全认证机制提供了全面且深入的…

springboot+tabula解析pdf中的表格数据

场景 在日常业务需求中&#xff0c;往往会遇到解析pdf数据获取文本的需求&#xff0c;常见的做法是使用 pdfbox 来做&#xff0c;但是它只适合做一些简单的段落文本解析&#xff0c;无法处理表格这种复杂类型&#xff0c;因为单元格中的文本有换行的情况&#xff0c;无法对应到…

阿里FPGA XCKU3P开箱- 25G 光纤

阿里FPGA XCKU3P开箱 - Hello-FPGA - 博客园 25G 光纤 板子有2个SFP的光纤接口&#xff0c;最大支持25G速率&#xff0c;使用ibert 进行验证&#xff0c;SFP在BANK227的GTY 接口。 ibert 配置如下&#xff1a; 测试 测试符合预期&#xff0c;确认了SFP的具体位置 和 支持的速…

.NET Core DI(依赖注入)的生命周期及应用场景

在.NET中&#xff0c;依赖注入&#xff08;DI&#xff0c;Dependency Injection&#xff09;是一种设计模式&#xff0c;它通过将依赖关系注入到类中&#xff0c;而不是让类自己创建依赖项&#xff0c;来降低类之间的耦合度。这使得代码更加模块化、灵活和易于测试。在.NET中&a…

新技术学习方法

新技术学习方法 学习新技术的路线需要结合系统性规划与实践验证&#xff0c;以下是基于行业经验和学习科学整理的高效路径框架&#xff0c;适用于编程语言、开发框架、前沿技术等领域&#xff1a; 一、明确学习目标与动机&#xff08;战略层&#xff09; 场景化需求分析 明确…

内网dns权威域名服务器搭建

目录 一、背景 二、dns简介 1、dns服务器类型 1、缓存域名服务器 2、主域名服务器 3、从域名服务器 2、dns解析过程 1、递归查询 2、迭代查询&#xff1a; 3、dns服务器类型 1、根域名服务器 2、顶级域名服务器 顶级域名可分为两类 顶级域名服务器的重要性体现在…

爱普生SG2520VGN差分晶振5G基站的时钟解决方案

在 5G 通信时代&#xff0c;数据流量呈爆发式增长&#xff0c;5G 基站作为信号的核心中转枢纽&#xff0c;承载着前所未有的数据传输与处理重任。从海量的物联网设备连接&#xff0c;到高速移动用户的数据交互&#xff0c;每一个环节都对基站的性能提出了严苛要求。而精准稳定的…

Linux中设置文件开机自启

###方法有很多&#xff0c;这里只分享一个systemd的方法 1.创建service文件 在/etc/systemd/system/下创建&#xff0c;自己命名&#xff0c;后缀是.service 创建方式有两种&#xff1a; 进入/etc/systemd/system创建&#xff0c;创建后使用sudo vim编辑使用sudo nano /etc/…

AWTK-MVVM 如何让多个View复用一个Model记录+关于app_conf的踩坑

前言 有这么一个业务&#xff0c;主界面点击应用窗口进入声纳显示界面&#xff0c;声纳显示界面再通过按钮进入菜单界面&#xff0c;菜单界面有很多关于该声纳显示界面的设置项&#xff0c;比如量程&#xff0c;增益&#xff0c;时间显示&#xff0c;亮度&#xff0c;对比度等…

kotlin音乐之自定义唱片组件(简单版本)

代码地址 import android.animation.ObjectAnimator import android.animation.ValueAnimator import android.content.Context import android.os.Binder import android.util.AttributeSet import android.view.animation.LinearInterpolator import androidx.appcompat.widg…