遇到的问题之“加入Spring的事务 @Transactional(rollbackFor = Exception.class)导致@DS数据库切换失效”
1. 核心问题:事务与数据源的绑定时机
执行流程问题:
-
事务切面先执行:Spring 的
@Transactional切面先执行 -
获取数据库连接:事务管理器从默认数据源获取连接
-
开启事务:在默认连接上开启事务
-
DS切面后执行:
@DS注解的切面后执行,尝试切换数据源 -
数据源切换失败:此时连接已绑定到事务,无法再切换
发布时间:2026/7/31 22:43:36
@Service public class DataService {@DS("starrocks") // 希望切换到 StarRocks@Transactional // Spring 事务注解public void processData() {// 方法体 } }
事务切面先执行:Spring 的 @Transactional 切面先执行
获取数据库连接:事务管理器从默认数据源获取连接
开启事务:在默认连接上开启事务
DS切面后执行:@DS 注解的切面后执行,尝试切换数据源
数据源切换失败:此时连接已绑定到事务,无法再切换
// 伪代码:AOP 执行顺序 public Object invoke(MethodInvocation invocation) {// 1. 事务切面先执行 TransactionAspectSupport.beginTransaction();// ↓ 这里获取了默认数据源的连接// 2. DS切面后执行(如果切面顺序没调整)DynamicDataSourceContextHolder.push("starrocks");// 3. 执行业务方法Object result = invocation.proceed();// 4. DS切面清理 DynamicDataSourceContextHolder.poll();// 5. 事务切面提交 TransactionAspectSupport.commitTransaction(); }
@Service public class UserService {@DS("mysql") // 主库 @Transactionalpublic void updateUser(User user) {userMapper.update(user);// 调用统计服务statsService.updateStats(user); // 这里可能无法切换到 StarRocks } }@Service public class StatsService {@DS("starrocks") // 希望用 StarRocks@Transactional(propagation = Propagation.REQUIRES_NEW) // 新事务public void updateStats(User user) {// 由于外层已有事务,这里可能仍然使用 MySQL 连接 statsMapper.insert(user);} }
2025年知名的粉碎机厂家推荐排行榜行业背景与市场趋势粉碎机作为工业生产中不可或缺的关键设备,在塑料回收、食品加工、制药、化工等多个领域发挥着重要作用。随着全球环保意识的提升和循环经济理念的深入,粉碎机市场…
2025年12月软件开发公司权威推荐榜:小程序开发、APP开发,创新技术驱动与高效交付实力之选 在数字经济浪潮持续深化的今天,企业数字化转型已从“选择题”变为“必答题”。无论是旨在打通线上线下服务闭环的小程序开发…
摘要 宣传册设计行业在2025年持续蓬勃发展,随着企业品牌化需求增加,定制化、高适配的设计服务成为市场主流。本文基于行业数据和用户反馈,整理出宣传册设计公司排名前十的榜单,旨在为企业提供参考。表单内容综合了…
MQTT 会话是 MQTT 协议中用于维持客户端与服务端之间通信状态的核心机制,它不局限于网络连接存活的时间段内,还可以在客户端和服务端的多次连续网络连接之间延续,以此保障网络波动场景下的通信连续性,避免消息丢失、重复订阅等问题…
当前,由于人们生活水平的提高和思想观念的改变,然后随着经济全球化的背景之下,互联网技术将进一步提高社会综合发展的效率和速度,互联网技术也会涉及到各个领域,于是传统的管理方式对时间、地点的限制太多,…
2026 安徽中考落幕,不少家长和同学正在寻找合适的中职、技工院校。分数达不到普高线,不代表求学无路,选择一所资质正规、实训条件完善、兼顾升学与就业的学校至关重要。今天带大家全面了解合肥中科信息工程技工学校…
终极指南:如何使用QuickRecorder轻松实现macOS专业级屏幕录制 【免费下载链接】QuickRecorder A lightweight screen recorder based on ScreenCapture Kit for macOS / 基于 ScreenCapture Kit 的轻量化多功能 macOS 录屏工具 项目地址: https://gitcode.com/Git…
在数据分析工作流中,从PDF报表中提取结构化数据是一个高频但高成本的环节。PDF格式在保存表格数据时存在天然缺陷——表格信息被渲染为页面坐标,列边界、表头层级等结构信息在转换时容易被破坏。本文对8款PDF转CSV工具进行标准化测试,聚焦数据…
如何在3分钟内快速上手Teable:AI原生无代码数据库的终极指南 【免费下载链接】teable ✨ AI Spreadsheet for Business 项目地址: https://gitcode.com/GitHub_Trending/te/teable Teable是一款创新的AI原生无代码数据库,将电子表格的易用性与专业…
ffmpeg-static 跨平台多媒体处理架构解析与技术实践 【免费下载链接】ffmpeg-static ffmpeg static binaries for Mac OSX and Linux and Windows 项目地址: https://gitcode.com/gh_mirrors/ff/ffmpeg-static ffmpeg-static 项目为 macOS、Linux 和 Windows 三大主流操…
7步掌握KMS智能激活工具:Windows和Office永久激活完整方案 【免费下载链接】KMS_VL_ALL_AIO Smart Activation Script 项目地址: https://gitcode.com/gh_mirrors/km/KMS_VL_ALL_AIO KMS_VL_ALL_AIO是一款功能强大的智能激活脚本工具,专为Windows…
一、命令简介strings 命令用于在二进制文件、可执行文件、对象文件或任何数据文件中查找并提取可打印的字符串序列。它默认识别长度至少为 4 个字符的可打印 ASCII 字符串(以换行符或空字符终止)。该工具在逆向工程、调试和二进制文件分析中非常有用&…
Apex检测数据集数据集详情检测类别: allies enemy tag图片总量:7247张训练集:5139张验证集:1425张测试集:683张标注状态:全部已标注,即拿即用数据格式:支持YOLO格式及其他格式&#…
智慧飞行-大疆无人机一站式智能管控平台/支持大疆机场/私有化部署 企业级全域智能无人机一体化管控平台源码! 专为电力巡检、安防监控、应急救援、测绘勘察等行业打造,让您的无人机舰队实现 “无人化、自动化、智能化” 管理! 🎯 …
更多请点击: https://codechina.net 第一章:AI帮助理解数学概念 人工智能正以前所未有的方式重塑数学学习的路径。通过自然语言处理与符号计算的深度融合,AI不仅能解析抽象定义,还能将定理、证明和几何直觉转化为可交互、可验证的…
在串(字符串)的顺序存储中,内存回收的方式取决于字符串的存储方式以及所使用的编程语言和相关库。以下以 C 为例进行说明,因为 C 对内存管理有较为直接的控制。 1. 基于 char 数组的串顺序存储 如果使用普通的 char 数组来存储字…
移动端游戏功耗测试:先控制变量,再比较优化是否真的省电 摘要:功耗测试最容易犯的错误,是拿两次不同温度、不同亮度、不同场景的平均功率直接比较。本文给出一套可复现的游戏功耗测试方法,覆盖引擎特性验证、版本回归和黑盒体验测试,并说明如何把功耗与帧率、温控、CPU/G…
本文是“足球口袋教练 HarmonyOS 离线应用实战”系列第 3 篇。示例项目是一个 HarmonyOS / ArkTS / ArkUI 编写的离线足球训练助手,围绕真实页面、真实截图和可复现操作展开。 本篇要解决的问题 训练 App 的首页不能只展示欢迎语,它要解决“我现在该点哪…