当前位置: 首页 > article >正文

Spring事务提交后发MQ消息?用TransactionSynchronizationManager的afterCommit钩子,避免消息乱发

Spring事务提交后可靠发送MQ消息的工程实践在电商库存扣减、订单状态变更等典型业务场景中我们经常需要在数据库事务提交后触发异步消息通知。但若处理不当可能出现数据库事务回滚而消息已经发出的尴尬局面——这正是分布式系统数据一致性的经典难题。本文将深入剖析Spring框架提供的TransactionSynchronizationManager机制展示如何优雅地实现事务提交后的消息可靠投递。1. 事务与消息一致性的核心挑战假设我们有一个库存扣减服务先更新数据库库存然后发送MQ消息通知商品服务更新缓存。用伪代码表示Transactional public void reduceStock(Long itemId, int num) { // 更新数据库 itemMapper.updateStock(itemId, num); // 发送MQ消息 mqProducer.sendStockChangeMessage(itemId, num); }这段代码存在致命缺陷当updateStock执行成功但事务尚未提交时如果此时发生异常导致事务回滚MQ消息却已经发出且无法撤回。这将导致下游系统获取到错误的数据状态。传统解决方案如本地消息表需要额外存储而事务消息又依赖特定MQ中间件。相比之下Spring内置的TransactionSynchronizationManager提供了一种轻量级的同步机制完美契合这类场景。2. TransactionSynchronizationManager工作原理Spring的事务同步管理器本质上是一个事务生命周期挂钩系统允许我们在事务的关键节点插入自定义逻辑。其核心架构包含三个关键组件组件作用典型使用场景TransactionSynchronizationManager同步器注册中心管理同步器的注册与触发TransactionSynchronization同步器接口定义事务各阶段的回调方法TransactionSynchronizationAdapter适配器类空实现接口的适配器同步器的核心回调方法及其触发时机beforeCommit()- 事务提交前beforeCompletion()- 事务完成前提交或回滚afterCommit()- 事务成功提交后afterCompletion()- 事务完成后无论成功与否重要提示afterCommit和afterCompletion的区别在于前者仅在事务成功时触发后者无论成功失败都会触发。3. 实现事务后消息发送的最佳实践下面我们通过完整示例展示如何安全地实现事务提交后发送MQ消息Transactional public void processOrder(Order order) { // 1. 核心业务逻辑 orderMapper.create(order); inventoryMapper.reduceStock(order.getItemId(), order.getQuantity()); // 2. 注册事务同步器 TransactionSynchronizationManager.registerSynchronization( new TransactionSynchronizationAdapter() { Override public void afterCommit() { try { // 3. 事务提交后发送消息 mqProducer.sendOrderCreatedMessage( OrderMessage.from(order) ); } catch (Exception e) { log.error(消息发送失败, e); // 这里可以加入重试逻辑 } } Override public void afterCompletion(int status) { if (status STATUS_ROLLED_BACK) { log.warn(事务回滚取消相关操作); } } } ); }这段代码解决了几个关键问题消息发送时机确保只在事务成功提交后发送异常处理单独捕获消息发送异常不影响主事务状态感知通过afterCompletion感知事务最终状态4. 与其他方案的对比分析在实际项目中我们通常有多种技术选择。下表对比了常见方案的优缺点方案优点缺点适用场景TransactionSynchronization轻量级无需额外组件消息发送仍在事务线程中简单场景消息量小TransactionalEventListener解耦业务与消息逻辑依赖Spring事件机制需要完全解耦的场景本地消息表保证最终一致性需要额外存储高可靠性要求的场景RocketMQ事务消息原生支持分布式事务绑定特定MQ实现使用RocketMQ的系统对于大多数中小型系统TransactionSynchronization提供了最佳的成本效益比。但在以下情况可能需要考虑其他方案消息发送耗时较长超过1秒需要支持消息重试机制系统已经采用事件驱动架构5. 高级应用与注意事项5.1 多同步器的执行顺序当注册多个同步器时它们的执行顺序遵循注册的逆序后进先出。这在某些特殊场景下非常有用// 先注册的同步器后执行 TransactionSynchronizationManager.registerSynchronization(sync1); TransactionSynchronizationManager.registerSynchronization(sync2); // 执行顺序sync2 - sync15.2 资源清理的最佳实践除了发送消息事务同步器也常用于资源清理。一个典型的文件处理场景public void importData(File dataFile) { // 1. 开启事务 TransactionTemplate transactionTemplate ...; transactionTemplate.execute(status - { // 2. 处理文件数据 processDataFile(dataFile); // 3. 注册清理钩子 TransactionSynchronizationManager.registerSynchronization( new TransactionSynchronizationAdapter() { Override public void afterCompletion(int status) { // 无论成功失败都清理临时文件 Files.delete(dataFile.toPath()); } } ); return null; }); }5.3 异常处理策略在afterCommit中发送消息时必须考虑消息发送失败的情况。我们可以实现简单的重试机制Override public void afterCommit() { int retries 3; while (retries-- 0) { try { mqProducer.sendMessage(message); break; } catch (Exception e) { if (retries 0) { alertService.notifyAdmin(消息发送失败, e); } Thread.sleep(1000); } } }6. 性能优化建议虽然TransactionSynchronization非常轻量但在高并发场景下仍需注意避免同步器阻塞afterCommit仍在事务线程执行长时间阻塞会影响整体性能考虑异步处理可以在afterCommit中提交任务到线程池减少同步器数量合并多个操作为一个同步器一个优化的异步处理示例Override public void afterCommit() { asyncExecutor.execute(() - { // 异步发送消息 mqProducer.sendMessage(message); }); }在实际项目中我们团队发现合理使用事务同步器可以将消息不一致的情况降低99%以上。特别是在秒杀系统中这种方案既保证了数据一致性又维持了系统的高性能。

相关文章:

Spring事务提交后发MQ消息?用TransactionSynchronizationManager的afterCommit钩子,避免消息乱发

Spring事务提交后可靠发送MQ消息的工程实践 在电商库存扣减、订单状态变更等典型业务场景中,我们经常需要在数据库事务提交后触发异步消息通知。但若处理不当,可能出现数据库事务回滚而消息已经发出的尴尬局面——这正是分布式系统数据一致性的经典难题。…...

从零到一:在VS2015中构建QT5.12开发环境的避坑指南

1. 环境准备:软件下载与版本选择 第一次在VS2015上搭建QT5.12开发环境时,我踩过的最大坑就是版本兼容性问题。QT5.12.10这个长期支持版本(LTS)虽然稳定,但和VS2015搭配时需要特别注意组件选择。建议直接从QT官网下载qt…...

baidupankey:自动化百度网盘提取码查询的技术解决方案

baidupankey:自动化百度网盘提取码查询的技术解决方案 【免费下载链接】baidupankey 项目地址: https://gitcode.com/gh_mirrors/ba/baidupankey 在数字资源获取的日常场景中,百度网盘作为国内主流的文件分享平台,其提取码机制既是资…...

WeChatPad:一键解锁微信双设备登录,告别单设备限制烦恼

WeChatPad:一键解锁微信双设备登录,告别单设备限制烦恼 【免费下载链接】WeChatPad 强制使用微信平板模式 项目地址: https://gitcode.com/gh_mirrors/we/WeChatPad 还在为微信无法同时在手机和平板上登录而烦恼吗?WeChatPad为你带来革…...

不锈钢彩涂板找哪家

朋友们,最近是不是在为厂房、仓库或者自家大棚的屋顶墙面材料发愁?想用不锈钢彩涂板,但市场上牌子五花八门,价格从几十到几百一平都有,到底该选哪家?选错了,可能用不了几年就锈迹斑斑&#xff0…...

统一过程原型深入分析和总结

统一过程(Rational Unified Process,RUP)是一种用例驱动、架构为中心、迭代增量的软件工程过程,由 Rational Software 公司(现属于 IBM)开发,并在其过程框架中广泛推广。RUP 融合了多种最佳实践,是一种可裁剪的通用过程框架。 一、核心思想 RUP 的核心原则可概括为: …...

统一过程模型和统一过程方法对比分析

统一过程模型(Unified Process Model,简称 UP)和统一过程方法(Rational Unified Process,简称 RUP)是软件工程领域中两个紧密相关但又有本质区别的概念。本文将从定义、范围、来源、应用等方面进行详细对比分析。 一、基本定义 维度 统一过程模型(UP) 统一过程方法(RU…...

3分钟掌握百度网盘提取码智能查询:baidupankey终极指南

3分钟掌握百度网盘提取码智能查询:baidupankey终极指南 【免费下载链接】baidupankey 项目地址: https://gitcode.com/gh_mirrors/ba/baidupankey 还在为百度网盘资源提取码而烦恼吗?每次看到心仪的学习资料、软件工具或影音文件,却因…...

NVIDIA Profile Inspector终极指南:3步解锁显卡隐藏性能,游戏帧率飙升50%

NVIDIA Profile Inspector终极指南:3步解锁显卡隐藏性能,游戏帧率飙升50% 【免费下载链接】nvidiaProfileInspector 项目地址: https://gitcode.com/gh_mirrors/nv/nvidiaProfileInspector NVIDIA Profile Inspector是一款功能强大的显卡驱动深度…...

从开环到闭环:我的3D打印机挤出机电机升级记(基于Arduino+TB6600驱动器)

从开环到闭环:我的3D打印机挤出机电机升级记(基于ArduinoTB6600驱动器) 去年冬天的一个深夜,我的3D打印机正在赶制一批圣诞装饰件。当打印到第15个小时时,突然听到挤出机发出刺耳的"咔咔"声——又是该死的挤…...

用STM32F103ZET6和两个L298N驱动板,手把手教你做一个能调速的四轮小车(附完整代码)

基于STM32F103与L298N的四驱智能小车全流程开发指南 在嵌入式开发领域,电机控制一直是连接数字世界与物理运动的关键桥梁。当STM32微控制器遇上经典的L298N驱动模块,再配合精准的PWM调速技术,一个灵活可控的四驱小车平台便呼之欲出。本文将完…...

SQL中窗口函数的LIMIT限制逻辑_如何分页显示

窗口函数不支持在OVER()中使用LIMIT,正确分页需先用ROW_NUMBER()等生成序号,再在外层WHERE中筛选范围;ORDER BY必须包含唯一字段(如主键)以保证分页稳定性。窗口函数本身不支持 LIMIT,别在 OVER() 里写 LIM…...

实战避坑|Java部署YOLO全踩坑实录:模型加载失败/推理延迟高一站式解决

前言 在工业视觉检测、智能安防上位机、嵌入式视觉项目中,Java凭借跨平台、生态成熟、适配Windows/统信UOS等优势,成为大量企业级视觉项目的首选开发语言。但在实际部署YOLOv5/v8/v11模型时,几乎所有开发者都会遇到两个致命问题:模…...

工业级实战:Java优化YOLO推理全流程,帧率稳定突破30FPS实时检测

前言 在工业视觉检测、智能安防、现场实时识别等落地场景中,Java凭借其跨平台兼容性、成熟的企业级生态以及稳定的运行特性,依旧是大量后端与桌面视觉项目的核心开发语言。但谈及YOLO系列目标检测模型的推理部署,业内普遍存在固有认知&#x…...

DownKyi:B站视频下载的完整指南,从入门到精通

DownKyi:B站视频下载的完整指南,从入门到精通 【免费下载链接】downkyi 哔哩下载姬downkyi,哔哩哔哩网站视频下载工具,支持批量下载,支持8K、HDR、杜比视界,提供工具箱(音视频提取、去水印等&am…...

Seraphine终极指南:英雄联盟自动BP与战绩查询的完整解决方案

Seraphine终极指南:英雄联盟自动BP与战绩查询的完整解决方案 【免费下载链接】Seraphine 英雄联盟战绩查询工具 项目地址: https://gitcode.com/gh_mirrors/se/Seraphine Seraphine是一款基于LCU API开发的免费开源英雄联盟战绩查询工具,它不仅提…...

5千字长文:一篇看懂 Agent Harness 的结构!

这篇文章我提取的最核心的一句话是:Agent Model Harness。 模型负责智能,Harness 负责把这份智能变成能持续工作的系统。真正决定 agent 上限的,不只是底座模型,而是模型外面的那整套文件系统、工具、记忆、状态、验证和上下文…...

首篇全新情景认知视角的大模型Agent综述

大家都在谈 Agent,真正拉开差异的关键,来自我们怎样理解 Agent。 若将 Agent 理解为由规划、记忆、行动、反思组成的系统,读者很快会记住一串模块名,却较难抓住它在真实环境里怎样持续工作。中科大的这篇 Survey 试图把问题向前推…...

XUnity.AutoTranslator完整教程:轻松实现Unity游戏实时翻译

XUnity.AutoTranslator完整教程:轻松实现Unity游戏实时翻译 【免费下载链接】XUnity.AutoTranslator 项目地址: https://gitcode.com/gh_mirrors/xu/XUnity.AutoTranslator 还在为看不懂的外文游戏而烦恼吗?XUnity.AutoTranslator是一款功能强大…...

从玩具车到智能车:给你的51单片机循迹小车加上LCD1602和蓝牙遥控(HC-05/06)

从玩具车到智能车:51单片机循迹小车的LCD1602与蓝牙遥控升级指南 当你看着自己亲手组装的51单片机循迹小车沿着黑线平稳运行时,那种成就感不言而喻。但作为创客,我们总想让项目更上一层楼——为什么不给它加上实时数据显示和手机遥控功能&…...

DownKyi:解锁B站视频自由存取的数字工具箱

DownKyi:解锁B站视频自由存取的数字工具箱 【免费下载链接】downkyi 哔哩下载姬downkyi,哔哩哔哩网站视频下载工具,支持批量下载,支持8K、HDR、杜比视界,提供工具箱(音视频提取、去水印等)。 …...

STM32 RTC掉电后时间不准?手把手教你排查VBAT供电和LSE晶振问题

STM32 RTC掉电后时间不准?手把手教你排查VBAT供电和LSE晶振问题 当产品需要持续计时功能时,STM32的RTC模块往往是首选方案。但在实际项目中,工程师们常会遇到一个棘手问题:设备断电重启后,RTC时间出现明显偏差甚至完全…...

STM32G474硬件IIC+DMA驱动OLED翻车实录:从软件IIC迁移到DMA的三大坑与解决方案

STM32硬件IICDMA驱动OLED的进阶实战:从软件迁移到DMA的深度避坑指南 当你在STM32项目中使用软件IIC驱动OLED屏幕时,可能会遇到性能瓶颈。这时候,硬件IICDMA的组合看起来是个完美的解决方案——理论上它能大幅降低CPU负载,提升整体…...

LLM Wiki + Research Skill Graph + Obsidian 从零构建你的个人知识库和研究引擎

2026年4月3日,安德烈卡帕西(OpenAI联合创始人、特斯拉前人工智能主管,也是“氛围编程”一词的创造者)发布了一条标题为“大语言模型知识库”的推文,讲述了他如今如何利用大语言模型构建个人知识维基,而非仅…...

3大智能功能,彻底改变你的英雄联盟BP体验

3大智能功能,彻底改变你的英雄联盟BP体验 【免费下载链接】Seraphine 英雄联盟战绩查询工具 项目地址: https://gitcode.com/gh_mirrors/se/Seraphine 你是否还在为排位赛BP阶段手忙脚乱而烦恼?是否因为犹豫不决错过了最佳英雄选择时机&#xff1…...

HsMod终极指南:55项炉石传说增强功能完全解析与实战配置教程

HsMod终极指南:55项炉石传说增强功能完全解析与实战配置教程 【免费下载链接】HsMod Hearthstone Modification Based on BepInEx 项目地址: https://gitcode.com/GitHub_Trending/hs/HsMod HsMod是基于BepInEx框架开发的炉石传说游戏增强插件,为…...

XUnity.AutoTranslator完全指南:5分钟实现Unity游戏实时翻译

XUnity.AutoTranslator完全指南:5分钟实现Unity游戏实时翻译 【免费下载链接】XUnity.AutoTranslator 项目地址: https://gitcode.com/gh_mirrors/xu/XUnity.AutoTranslator 你是否曾经遇到过一款精彩的Unity游戏,但因为语言障碍而无法完全享受游…...

开源百度网盘提取码智能解析工具:技术实现与效率优化

开源百度网盘提取码智能解析工具:技术实现与效率优化 【免费下载链接】baidupankey 项目地址: https://gitcode.com/gh_mirrors/ba/baidupankey 在云存储资源分享日益频繁的技术环境中,百度网盘提取码查询已成为开发者、研究者和内容创作者面临的…...

GHelper:华硕笔记本性能控制的终极轻量级解决方案

GHelper:华硕笔记本性能控制的终极轻量级解决方案 【免费下载链接】g-helper Lightweight, open-source control tool for ASUS laptops and ROG Ally. Manage performance modes, fans, GPU, battery, and RGB lighting across Zephyrus, Flow, TUF, Strix, Scar, …...

3步解锁DownKyi:你的B站视频下载与管理终极解决方案

3步解锁DownKyi:你的B站视频下载与管理终极解决方案 【免费下载链接】downkyi 哔哩下载姬downkyi,哔哩哔哩网站视频下载工具,支持批量下载,支持8K、HDR、杜比视界,提供工具箱(音视频提取、去水印等&#xf…...