分布式事务问题的种常见解决方案《第六章》
在微服务架构与分布式系统盛行的今天数据一致性问题成为开发者必须直面的核心挑战。传统的本地事务ACID在跨服务、跨数据库的场景下显得力不从心分布式事务应运而生。本文将从实战角度出发深入剖析6种主流的分布式事务解决方案并附上可运行的代码示例助你根据业务场景精准选型。### 1. 两阶段提交2PC/XA原理引入全局事务管理器TM分两阶段协调多个资源管理器RM。阶段一TM询问所有RM是否可提交阶段二若全部同意则全局提交否则全局回滚。优点强一致性实现简单。缺点存在同步阻塞协调者单点极端情况下可能阻塞如协调者宕机。适用场景对一致性要求极高、并发量低的内部系统。代码示例Java JTAjavaimport javax.transaction.UserTransaction;import javax.naming.InitialContext;public class TwoPhaseCommitDemo { public void transfer() throws Exception { InitialContext ctx new InitialContext(); UserTransaction utx (UserTransaction) ctx.lookup(java:comp/UserTransaction); try { utx.begin(); // 操作数据库A jdbcA.execute(UPDATE account SET balance balance - 100 WHERE id 1); // 操作数据库B jdbcB.execute(UPDATE account SET balance balance 100 WHERE id 2); utx.commit(); // 全局提交 } catch (Exception e) { utx.rollback(); // 全局回滚 throw e; } }}### 2. 三阶段提交3PC原理在2PC基础上引入“准备提交”阶段CanCommit, PreCommit, DoCommit增加超时机制降低阻塞风险。优点解决协调者故障导致的阻塞问题。缺点实现复杂极端情况仍无法保证完全一致性。适用场景对2PC阻塞敏感但可容忍少量不一致的分布式系统。代码示例伪代码python# 三阶段提交状态机示意class ThreePhaseCommit: def can_commit(self, participants): for p in participants: if not p.prepare(): return False return True def pre_commit(self, participants): for p in participants: p.pre_commit() # 写入undo日志 def do_commit(self, participants): for p in participants: p.commit() # 最终提交### 3. 本地消息表异步确保原理核心思路是“最终一致性”。在业务操作所在的数据库中创建消息表将业务操作与写消息表放在同一个本地事务中然后通过定时任务或消息队列将消息发送给下游服务下游消费成功后回调确认。优点无强依赖性能较好可靠性高。缺点需要额外维护消息表存在消息重复消费问题需幂等。适用场景订单系统、支付系统等对一致性要求中等、性能要求高的场景。代码示例Spring MyBatisjavaTransactionalpublic void createOrder(Order order) { // 1. 插入订单表本地事务 orderMapper.insert(order); // 2. 插入消息表同一本地事务 MessageRecord msg new MessageRecord(); msg.setMsgId(UUID.randomUUID().toString()); msg.setContent(JSON.toJSONString(order)); msg.setStatus(pending); messageMapper.insert(msg); // 3. 事务提交后定时任务扫描消息表发送MQ}Scheduled(cron 0/5 * * * * ?)public void sendMessage() { ListMessageRecord pendingList messageMapper.selectPending(); for (MessageRecord record : pendingList) { try { mqTemplate.send(order_topic, record.getContent()); record.setStatus(sent); messageMapper.update(record); } catch (Exception e) { // 重试或告警 } }}### 4. 事务消息RocketMQ原理利用消息队列的事务消息特性。发送方先发送“半消息”对消费者不可见然后执行本地事务根据结果提交或回滚半消息。消息队列在超时后主动回查事务状态。优点解耦性强无需额外消息表可靠性高。缺点依赖特定MQ如RocketMQ对回查接口有要求。适用场景电商下单、库存扣减等异步解耦场景。代码示例RocketMQjava// 发送事务消息TransactionMQProducer producer new TransactionMQProducer(tx_producer);producer.setTransactionListener(new TransactionListener() { Override public LocalTransactionState executeLocalTransaction(Message msg, Object arg) { try { // 执行本地业务如扣减库存 orderService.createOrder(arg); return LocalTransactionState.COMMIT_MESSAGE; } catch (Exception e) { return LocalTransactionState.ROLLBACK_MESSAGE; } } Override public LocalTransactionState checkLocalTransaction(MessageExt msg) { // 回查本地事务状态 String orderId msg.getKeys(); return orderService.isOrderExists(orderId) ? LocalTransactionState.COMMIT_MESSAGE : LocalTransactionState.ROLLBACK_MESSAGE; }});// 发送半消息Message msg new Message(order_topic, order, orderId, orderInfo.getBytes());SendResult sendResult producer.sendMessageInTransaction(msg, orderInfo);### 5. TCCTry-Confirm-Cancel原理业务层面拆分为三个操作Try预留资源、Confirm确认执行、Cancel回滚释放。每个参与方实现这三个接口由协调者统一调度。优点无阻塞性能高灵活性好。缺点业务侵入性强需要编写大量补偿逻辑实现复杂。适用场景资金类操作转账、支付、票务预订等需要强资源控制的场景。代码示例Java 接口定义javapublic interface TccAction { // 预留资源如冻结余额 boolean try() throws Exception; // 确认执行扣减冻结金额 boolean confirm() throws Exception; // 取消解冻余额 boolean cancel() throws Exception;}// 协调器伪代码public class TccCoordinator { public void doTcc(ListTccAction actions) { // Try阶段 for (TccAction action : actions) { if (!action.try()) { // 执行Cancel for (int i actions.size()-1; i 0; i--) { actions.get(i).cancel(); } return; } } // Confirm阶段 for (TccAction action : actions) { action.confirm(); } }}### 6. Saga 模式原理将长事务拆分为一系列本地事务每个事务有对应的补偿操作。若某一步失败则依次调用之前的补偿操作回滚。优点无阻塞适合长事务性能较好。缺点隔离性弱事务间未提交的数据不可见需要设计补偿操作。适用场景旅游预订订机票酒店、订单聚合等跨服务多步骤流程。代码示例Spring Boot Sagajava// 定义Saga步骤Componentpublic class SagaOrderFlow { Autowired private OrderService orderService; Autowired private InventoryService inventoryService; Autowired private PaymentService paymentService; // 主流程 public void createOrderSaga() { try { Long orderId orderService.createOrder(); // 步骤1 inventoryService.deductStock(orderId); // 步骤2 paymentService.pay(orderId); // 步骤3 } catch (Exception e) { // 补偿反向调用 paymentService.refund(orderId); inventoryService.addStock(orderId); orderService.cancelOrder(orderId); } }}### 总结分布式事务没有“银弹”每种方案都有其特定的适用场景与代价-强一致性优先选择2PC/3PC但需接受性能与可用性折损。-最终一致性优先本地消息表、事务消息、Saga是常见选择其中事务消息最优雅Saga适合长事务。-资源控制需求TCC虽复杂但对资金类操作最为安全。实际开发中建议先明确业务对一致性的容忍度、吞吐量要求以及团队技术栈再做出选型。同时务必考虑幂等设计、重试机制与监控告警以确保系统的鲁棒性。分布式事务的实践是架构师必修课希望本文能为你在技术决策中提供有价值的参考。

相关新闻

点云标注-语义分割

点云标注-语义分割

点云数据标注工具,就语义分割标注这块,之前还特意调研过,开源的项目里,目前没有一个比较好用的工具,而且工具都比较老旧,有些工具难用且上手难度高。我个人觉得,可能在点云标注领域这块&#xf…

2026/10/9 2:52:47 阅读更多 →
卷积核与前反向传播机制

卷积核与前反向传播机制

卷积核(滤波器)简单介绍作用:对图片求卷积操作,不同的卷积核求取的图片的特征不同操作:对应位置乘积相加步长:卷积核每次移动的单位长度。 步长越大,特征图越小(手动设置&#xff…

2026/10/9 2:52:47 阅读更多 →
飞瓜数据APP数据协议api采集

飞瓜数据APP数据协议api采集

声明 本文章中所有内容仅供学习交流使用,不用于其他任何目的,抓包内容、敏感网址、数据接口 等均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关! 有相关问题请第一时间点击头像看简介…

2026/10/9 2:52:47 阅读更多 →

最新新闻

ONS15454配置指南:单板识别与电路创建,从时隙到SNCP保护

ONS15454配置指南:单板识别与电路创建,从时隙到SNCP保护

简介:这是面向光网络运维与工程人员的一份思科ONS15454 SDH配置教学课件,聚焦同步数字体系设备的基础配置场景。内容系统覆盖客户端端口定义与SFP模块激活、STM-1/STM-4/STM-16端口类型选择、用户电路创建中的高阶电路(VC_HO_PATH_CIRCUIT&am…

2026/10/9 3:29:11 阅读更多 →
XIgnCode3反作弊绕过实战:x3.xem检测机制与无痕绕过技术

XIgnCode3反作弊绕过实战:x3.xem检测机制与无痕绕过技术

简介:这是一份面向逆向工程与游戏安全研究者的主机端模拟绕过方案,针对Wellbia的XignCode3反作弊系统。其核心思路是让宿主程序加载并初始化XignCode3,使完整性校验在宿主进程空间内完成,而客户端则劫持XignCode3相关文件与导出函…

2026/10/9 3:29:11 阅读更多 →
XingCode签名校验绕过:从.xem模块到内存断点回溯的工程实践

XingCode签名校验绕过:从.xem模块到内存断点回溯的工程实践

简介:这是一份面向逆向工程与游戏安全研究者的主机端模拟绕过方案,针对Wellbia的XignCode3反作弊系统。其核心思路是通过宿主应用初始化XignCode3,使完整性校验在独立进程空间内完成,再由客户端劫持相关文件与导出接口&#xff0c…

2026/10/9 3:29:11 阅读更多 →
CSS导航栏实例

CSS导航栏实例

本文目录1. 前言2. 目标效果3. 开发过程3.1 定义列表3.2 调整高度与背景色3.3 调整内外边距3.4 去掉项目符号3.5 设置列表项高度和位置3.6 设置字体样式3.6 让文字垂直居中3.7 设置列表项边距3.8 添加悬停效果4. 小结1. 前言 几乎所有网站都有导航栏,导航栏可以快速…

2026/10/9 3:29:11 阅读更多 →
CSS图片实例

CSS图片实例

本文目录1. 前言2. 普通图片3. 圆角图片4. 缩略图效果5.小结1. 前言 上一篇我们详细讲解了如何利用CSS,来制作一个好看的按钮。 本篇我们来研究下如何用CSS美化图片。 2. 普通图片 普通情况下,我们给图片设置个宽度和高度即可。 普通图片&#xff1a…

2026/10/9 3:29:11 阅读更多 →
Docker部署OpenClaw并接入飞书机器人:Windows实践指南

Docker部署OpenClaw并接入飞书机器人:Windows实践指南

这周我在Windows上把OpenClaw完整跑通了,并且成功接上了飞书机器人,整体链路还算顺。今天就把整套方案整理出来,从Docker环境的准备工作,到docker compose部署OpenClaw,再到飞书开放平台的应用配置和消息联调&#xff…

2026/10/9 3:28:11 阅读更多 →

日新闻

Java时间API实战:LocalDate、Date与ZonedDateTime的转换与避坑指南

Java时间API实战:LocalDate、Date与ZonedDateTime的转换与避坑指南

Java时间API这个话题,隔三差五就会在群里被翻出来讨论一次。上周还有个同事线上处理一个订单超时问题,排查到最后发现是ZonedDateTime序列化后时区丢了,用户在下单当天晚上看到的时间整整差了8个小时。这类问题几乎每个做Java开发的人都遇到过…

2026/10/9 0:00:49 阅读更多 →
EasyTier实践:从NAT穿透到子网代理的异地组网部署与排错

EasyTier实践:从NAT穿透到子网代理的异地组网部署与排错

前几个月我手头有好几台机器需要互相访问:办公室台式机、家里 NAS、还有一台云主机。如果只是偶尔传个文件倒还好,问题是工作场景经常要在几处环境之间来回切换,每次都先登录跳板机再层层代理,实在折腾。我先后试过端口映射、自建…

2026/10/9 0:00:49 阅读更多 →
AI Agent工程实战:从七要素到七个决策点的系统设计指南

AI Agent工程实战:从七要素到七个决策点的系统设计指南

AI Agent 这个词在过去一年里被反复提及,但真正动手搭过一套能跑起来的 Agent 系统的人都知道,从"知道它是什么"到"让它稳定干活"之间隔着一整套工程决策。我前后参与过几个 Agent 项目的落地,从最初用现成框架拼装&…

2026/10/9 0:01:50 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 15:26:32 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 15:26:40 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 10:10:36 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 21:13:17 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 15:26:17 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/7 13:34:55 阅读更多 →