202524 | 分布式事务
分布式事务(Distributed Transaction)
分布式事务是指跨多个数据库、服务或系统节点的事务操作,要求所有参与方要么全部成功提交,要么全部回滚,保证数据一致性。
1. 为什么需要分布式事务?
在单体应用中,事务可以通过数据库的 ACID(原子性、一致性、隔离性、持久性)保证。但在微服务或分布式系统中:
- 数据分散:不同服务使用不同的数据库(如订单库、库存库、支付库)。
- 网络不可靠:跨服务调用可能失败(如支付成功但库存扣减失败)。
- 业务复杂:多个服务需要协同完成一个业务(如电商下单 → 支付 → 库存扣减)。
示例场景:
- 问题:如果支付成功但库存扣减失败,数据不一致!
2. 分布式事务的挑战(CAP理论)
在分布式系统中,无法同时满足:
- 一致性(Consistency):所有节点数据一致。
- 可用性(Availability):服务总能响应。
- 分区容错性(Partition Tolerance):网络分区时仍能运行。
分布式系统必须选择 CP(强一致性)或 AP(高可用性)。
分布式事务的解决方案
分布式事务解决方案终极详解
一、核心问题与挑战
在分布式系统中,事务需要跨多个服务或数据库,面临三大核心问题:
- 原子性破坏:部分操作成功,部分失败
- 数据不一致:网络延迟或故障导致状态不一致
- 性能瓶颈:同步阻塞降低系统吞吐量
二、强一致性方案详解
1. 2PC(两阶段提交)
核心思想:通过协调者统一调度
关键问题:
- 同步阻塞:所有参与者在准备阶段锁定资源
- 单点故障:协调者宕机导致系统僵死
- 数据不一致:网络分区时可能部分提交
优化方案:
2. Seata AT模式
架构原理:
执行流程:
- 一阶段:
- 解析业务SQL生成前后镜像
- 本地提交并上报TC
- 二阶段:
- 成功:异步删除快照
- 失败:用前镜像回滚
全局锁机制:
三、最终一致性方案详解
1. TCC模式
三阶段操作:
异常处理设计:
注意事项:
- 必须实现幂等性
- 需要空回滚和防悬挂处理
- 业务侵入性强
2. Saga模式
两种实现方式对比:
事件编排示例:
补偿机制设计:
3. 本地消息表
完整架构:
可靠性保障:
四、方案选型矩阵**
| 维度 | 2PC | TCC | Saga | 本地消息表 | Seata AT |
|---|---|---|---|---|---|
| 一致性 | 强一致 | 最终一致 | 最终一致 | 最终一致 | 强一致 |
| 性能 | 低 | 高 | 中 | 中 | 中高 |
| 侵入性 | 无 | 高 | 中 | 低 | 低 |
| 复杂度 | 低 | 高 | 中 | 低 | 中 |
| 适用场景 | 金融支付 | 电商秒杀 | 长事务 | 日志同步 | 微服务 |
Seata
一、Seata 核心架构
核心组件:
- TC (Transaction Coordinator)
- 事务协调器(独立部署)
- 维护全局事务状态,驱动分支事务提交/回滚
- TM (Transaction Manager)
- 集成在应用中
- 定义事务边界,发起全局提交/回滚
- RM (Resource Manager)
- 管理分支事务,向TC注册分支状态
- 生成SQL镜像,实现数据回滚
二、Seata 的四种模式对比
| 模式 | 一致性 | 性能 | 侵入性 | 适用场景 |
|---|---|---|---|---|
| AT | 强一致 | 高 | 低 | 常规微服务 |
| TCC | 最终 | 极高 | 高 | 高并发(如秒杀) |
| Saga | 最终 | 中 | 中 | 长事务流程 |
| XA | 强一致 | 低 | 无 | 传统数据库兼容 |
三、AT 模式详解(默认模式)

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. 三阶段操作
2. 异常处理设计
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协议增强
2. 特点
- 完全兼容传统XA协议
- 需要数据库支持XA(MySQL 5.7+)
七、Seata 生产实践
1. 部署架构
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 与同类方案对比
| 特性 | Seata | DTX | ShardingSphere |
|---|---|---|---|
| AT模式 | ✔️ | ✖️ | ✖️ |
| TCC支持 | ✔️ | ✔️ | ✖️ |
| Saga支持 | ✔️ | ✖️ | ✔️ |
| XA支持 | ✔️ | ✔️ | ✔️ |
| 无侵入 | AT/XA | ✖️ | ✖️ |
九、最佳实践建议
- 常规业务:优先使用AT模式
- 高并发场景:TCC + 异步Confirm
- 长业务流程:Saga状态机 + 可视化监控
- 传统系统改造:XA模式
如果需要 具体场景的完整代码示例(如电商下单的AT模式实现),可以告诉我具体需求!
相关文章:
202524 | 分布式事务
分布式事务(Distributed Transaction) 分布式事务是指跨多个数据库、服务或系统节点的事务操作,要求所有参与方要么全部成功提交,要么全部回滚,保证数据一致性。 1. 为什么需要分布式事务? 在单体应用中&…...
Python 企业级架构实战(上篇)
深入企业级系统设计与高可用架构,掌握构建可扩展 Python 系统的核心技能。 41. 微服务架构设计与 FastAPI 实现 多服务协同开发示例 # 用户服务 (user_service/main.py) from fastapi import FastAPI app = FastAPI() users_db = { 1: {"id": 1, "name&…...
在 macOS 上修改 最大文件描述符限制(Too many open files) 和 网络端口相关参数 需要调整系统级配置的详细步骤
在 macOS 上修改 最大文件描述符限制(Too many open files) 和 网络端口相关参数 需要调整系统级配置。以下是详细步骤: 在 macOS 上修改 最大文件描述符限制(Too many open files) 和 网络端口相关参数 需要调整系统级…...
Python 文本和字节序列(字符问题)
本章将讨论下述话题: 字符、码位和字节表述 bytes、bytearray 和 memoryview 等二进制序列的独特特性 全部 Unicode 和陈旧字符集的编解码器 避免和处理编码错误 处理文本文件的最佳实践 默认编码的陷阱和标准 I/O 的问题 规范化 Unicode 文本,进行安全的…...
通过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(容器) 一、什么是容器? 通俗地讲,容器是镜像的运行实体。镜像是静态的只读文件,而容器带有运行时需要的可写文件层,并且容器中的进程属于运行状态。即容器运行着真正的应用进程。容器有…...
LoadableTransportInfo函数分析之RPCRT4!LOADABLE_TRANSPORT::LOADABLE_TRANSPORT初始化过程
LoadableTransportInfo函数分析 第一部分: RPC_STATUS LoadableTransportInfo ( IN RPC_CHAR * DllName, IN RPC_CHAR PAPI * RpcProtocolSequence, OUT TRANS_INFO * PAPI *pTransInfo ) { 。。。。。。。 pTransportInterface (*TransportLo…...
大模型预标注和自动化标注在OCR标注场景的应用
OCR,即光学字符识别,简单来说就是利用光学设备去捕获图像并识别文字,最终将图片中的文字转换为可编辑和可搜索的文本。在数字化时代,OCR(光学字符识别)技术作为处理图像中文字信息的关键手段,其…...
Zookeeper 命令返回数据的含义
下面详细讲解这三个 Zookeeper 命令返回数据的含义: 1. ls /path - 列出子节点 命令功能: 列出指定路径下的所有直接子节点名称(不包含孙子节点) 示例返回: [child1, child2, child3] 输出解析: 返回…...
蓝宝石狼组织升级攻击工具包,利用新型紫水晶窃密软件瞄准能源企业
网络安全专家发现,被称为"蓝宝石狼"(Sapphire Werewolf)的威胁组织正在使用升级版"紫水晶"(Amethyst)窃密软件,对能源行业企业发起复杂攻击活动。此次攻击标志着该组织能力显著提升&am…...
2025蓝桥杯python A组省赛 题解
真捐款去了,好长时间没练了,感觉脑子和手都不转悠了。 B F BF BF 赛时都写假了, G G G 也只写了爆搜。 题解其实队友都写好了,我就粘一下自己的代码,稍微提点个人的理解水一篇题解 队友题解 2025蓝桥杯C A组省赛 题…...
JMeter重要的是什么
重要特性 支持多种协议: JMeter支持对多种协议进行性能测试,包括HTTP、HTTPS、FTP、JDBC(数据库)、LDAP、JMS、SOAP、REST等。这使得它能够适应各种不同的测试场景。强大的负载模拟能力: JMeter能够模拟大量的虚拟用户…...
深入探索如何压缩 WebAssembly
一、初始体积:默认 Release 构建 我们从最基础的构建开始,不开启调试符号,仅使用默认的 release 模式: $ wc -c pkg/wasm_game_of_life_bg.wasm 29410 pkg/wasm_game_of_life_bg.wasm这是我们优化的起点 —— 29,410 字节。 二…...
浅谈SQL Server系统内核管理机制
浅谈SQL Server系统内核管理机制 应用环境 Microsoft Windows 10.0.19045.5487 x64 专业工作站版 22H2Microsoft SQL Server 2019 - 15.0.2130.3 (X64)SQL Server Management Studio -18.6 laster 文章目录 浅谈SQL Server系统内核管理机制数据库和文件服务器管理视图系统目录…...
关于我的服务器
最近我买了台腾讯云服务器,然后新手小白只会用宝塔。。。 安装完之后默认的端口是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题】完整版+代码+结果
# 问题一:随机森林回归from sklearn.ensemble import RandomForestRegressormodel_rf RandomForestRegressor()model_rf.fit(X_train, y_train)# 问题二: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 安装 可参考:...
关闭谷歌浏览器(Google Chrome)的自动更新可以通过以下方法实现。具体操作步骤取决于你的操作系统。
关闭谷歌浏览器(Google Chrome)的自动更新可以通过以下方法实现。具体操作步骤取决于你的操作系统。 1. 在 Windows 上关闭 Chrome 自动更新2. 在 macOS 上关闭 Chrome 自动更新3. 在 Linux 上关闭 Chrome 自动更新4. 注意事项1. 在 Windows 上关闭 Chro…...
【MCAL】AUTOSAR架构下基于SPI通信的驱动模块详解-以TJA1145为例
目录 前言 正文 1.TJA1145驱动代码中的SPI协议设计 1.1 对SPI Driver的依赖 1.2 对SPI配置的依赖 1.2.1 SpiExternalDevice 1.2.2 Channel_x 1.2.3 Job_x 1.2.4 Sequence N 1.2.5 Sequence M 1.2.6 Sequence L 1.2.7 小结 2.基于Vector驱动代码的SPI配置 2.1 SPI引…...
如何在vue3项目中使用 AbortController取消axios请求
在 Vue3 项目中通过 AbortController 取消 Axios 请求,可以通过以下 结构化步骤 实现。我们结合组合式 API(Composition API)和现代前端实践演示: 一、基础实现(单个请求) 1. 创建组件逻辑 <script s…...
监控docker中的java应用
1)进入指定的容器 docker exec -it demo /bin/bash 2)下载curl root89a67e345354:/# apt install curl -y 3)下载arthas root89a67e345354:/# curl -O https://arthas.aliyun.com/arthas-boot.jar 4)运行 root89a67e345354:/# java -jar arthas-boot.jar 5)监控 […...
JWT令牌:实现安全会话跟踪与登录认证的利器
摘要:本文深入探讨了JWT令牌在实现会话跟踪和登录认证方面的应用,详细介绍了JWT令牌的概念、组成、生成与校验方法,以及在实际案例中如何通过JWT令牌进行会话跟踪和登录认证的具体实现步骤,为系统的安全认证机制提供了全面且深入的…...
VS 中Git 中本地提交完成,没有推送,修改的内容如何还原
在 Visual Studio 中撤销本地提交但未推送的修改,可以通过以下方法实现: 一、保留修改内容(仅撤销提交记录) 使用 git reset --soft 在 VS 的 Git 终端中执行: git reset --soft HEAD~1作用:撤销最后一次提…...
springboot+tabula解析pdf中的表格数据
场景 在日常业务需求中,往往会遇到解析pdf数据获取文本的需求,常见的做法是使用 pdfbox 来做,但是它只适合做一些简单的段落文本解析,无法处理表格这种复杂类型,因为单元格中的文本有换行的情况,无法对应到…...
Ubuntu18.04 ROS Melodic安装
环境配置:Ubuntu18.04 ROS Melodic安装_ubuntu18.04安装ros melodic-CSDN博客 1 设置安装源 为了安装ROS Melodic,首先需要在Ubuntu 18.04 LTS上添加安装源到source.list,方法如下: 国外的: sudo sh -c echo "deb http://…...
阿里FPGA XCKU3P开箱- 25G 光纤
阿里FPGA XCKU3P开箱 - Hello-FPGA - 博客园 25G 光纤 板子有2个SFP的光纤接口,最大支持25G速率,使用ibert 进行验证,SFP在BANK227的GTY 接口。 ibert 配置如下: 测试 测试符合预期,确认了SFP的具体位置 和 支持的速…...
ArrayList vs LinkedList,HashMap vs TreeMap:如何选择最适合的集合类?
精心整理了最新的面试资料和简历模板,有需要的可以自行获取 点击前往百度网盘获取 点击前往夸克网盘获取 在 Java 开发中,集合类的选择直接影响程序的性能和代码的可维护性。不同的数据结构适用于不同的场景,盲目使用可能导致内存浪费、性能…...
