先分析一下

1,内部调用,@原对象调用,不是代理对象调用

2,private方法,@源码中,只能是public方法

3,异常被捕获了,@事物拦截器,无法感知

4,子线程调用,@事物TreadLocal实现,主子线程独立

5,Roback 设置不对,@默认对RuntimeExcpetion+error有效,sql,io无效,@Exception

6,传播机制不对,@被调用方法B是new,A调用B,A异常,B不会滚,他是新的事物

7,存储引擎不是innodb

8,事物未开启

DS

@Transactional 注解失效的场景及原因分析

@Transactional 是 Spring 声明式事务的核心注解,但在某些场景下会失效。以下是常见的失效场景及其根本原因:


1. 自调用(同一个类中方法调用)

场景

java

复制

下载

public class OrderService {public void createOrder() {this.updateStatus(); // 自调用,事务失效}@Transactionalpublic void updateStatus() {// 业务逻辑}
}

原因

  • Spring 事务基于 AOP 代理实现,自调用时通过 this 调用的原始对象而非代理对象,导致拦截器无法介入。

解决方案

  • 注入自身代理:@Autowired private OrderService self; 然后调用 self.updateStatus()

  • 将方法拆分到不同类中


2. 方法访问权限非 public

场景

java

复制

下载

@Transactional
private void updateData() { // 事务失效// ...
}

原因

  • Spring 默认只代理 public 方法(CGLIB 可代理 protected,但官方不建议)。

  • 动态代理(JDK/CGLIB)无法拦截 private 方法。

解决方案

  • 将方法改为 public

  • 改用编程式事务(TransactionTemplate


3. 异常类型不匹配

场景

java

复制

下载

@Transactional
public void process() throws Exception {try {// 可能抛出IOException} catch (IOException e) {throw new Exception("业务异常"); // 非RuntimeException}
}

原因

  • 默认只对 RuntimeException 和 Error 回滚,受检异常(如 Exception)不会触发回滚。

解决方案

  • 明确指定回滚异常:

    java

    复制

    下载

    @Transactional(rollbackFor = Exception.class)
  • 抛出 RuntimeException 或其子类


4. 数据库引擎不支持事务

场景

  • 使用 MyISAM 引擎的 MySQL 表

  • 某些 NoSQL 数据库(如 MongoDB 旧版本)

原因

  • MyISAM 不支持事务,仅 InnoDB 支持。

  • 部分数据库无事务能力。

解决方案

  • 切换为 InnoDB 引擎:

    sql

    复制

    下载

    ALTER TABLE your_table ENGINE=InnoDB;

5. 多线程调用

场景

java

复制

下载

@Transactional
public void asyncTask() {new Thread(() -> {// 子线程中的操作不受事务控制}).start();
}

原因

  • 事务信息通过 ThreadLocal 存储,子线程无法继承父线程的事务上下文。

解决方案

  • 使用 TransactionTemplate 编程式事务

  • 通过异步事件(如 @TransactionalEventListener)处理


6. 未启用事务管理

场景

  • 忘记添加 @EnableTransactionManagement

  • 配置错误(如错误的 PlatformTransactionManager Bean)

原因

  • Spring 未扫描到 @Transactional 注解或未创建代理。

解决方案

  • 确保配置类添加注解:

    java

    复制

    下载

    @Configuration
    @EnableTransactionManagement // 关键
    public class AppConfig { ... }
  • 检查事务管理器 Bean 是否正确注入


7. 嵌套事务传播行为不当

场景

java

复制

下载

@Transactional(propagation = Propagation.REQUIRED)
public void methodA() {methodB();
}@Transactional(propagation = Propagation.REQUIRES_NEW)
public void methodB() {// 如果methodA抛异常,methodB仍会提交
}

原因

  • REQUIRES_NEW 会挂起当前事务,独立提交。若外层事务回滚,内层事务不受影响。

解决方案

  • 根据业务需求调整传播行为(如改用 NESTED


8. 事务方法内捕获异常未重新抛出

场景

java

复制

下载

@Transactional
public void process() {try {// 可能抛出异常的操作} catch (Exception e) {log.error("错误", e); // 仅记录不抛出}
}

原因

  • 拦截器无法感知异常,事务标记为成功。

解决方案

  • 捕获后手动回滚:

    java

    复制

    下载

    TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
  • 或重新抛出异常


总结:事务失效排查清单

失效场景关键特征验证方法
自调用同类中非代理调用检查是否通过 this 调用
非 public 方法方法为 private/protected查看方法修饰符
异常类型不匹配捕获后未抛出或抛出受检异常检查异常处理逻辑
数据库引擎不支持使用 MyISAM 引擎SHOW TABLE STATUS 查看引擎
多线程调用子线程内操作检查是否有 new Thread()
未启用事务管理无事务管理器 Bean检查 @EnableTransactionManagement
嵌套事务传播不当内外层事务相互影响检查 propagation 配置
捕获异常未处理try-catch 吞没异常检查日志是否有未抛出的异常记录

终极调试技巧
在调试模式下查看目标对象类名:

  • 代理对象:com.sun.proxy.$ProxyXX(JDK)或 UserService$$EnhancerBySpringCGLIB

  • 原始对象:com.example.UserService
    若调用的是原始对象,则事务必然失效。

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

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用unity创建项目,进行动画制作

1. 创建unity项目 error: error CS0006: Metadata file Library/PackageCache/com.unity.collab-proxy2.8.2/Lib/Editor/PlasticSCM/log4netPlastic.dll could not be found error CS0006: Metadata file Library/PackageCache/com.unity.collab-proxy2.8.2/Lib/Editor/Plasti…

Centos系统及国产麒麟系统设置自己写的go服务的开机启动项完整教程

1、创建服务文件 在 /etc/systemd/system/ 下新建服务配置文件(需sudo权限),例如: sudo nano /etc/systemd/system/mygo.service 如下图,创建的mygo.service 2、创建内容如下: DescriptionThe go HTTP a…

Java面试宝典: IO流

1. 下面哪个流类属于面向字符的输入流() 选项: A. BufferedWriter B. FileInputStream C. ObjectInputStream D. InputStreamReader 答案:D 详细分析: 字符流与字节流的本质区别: 字符流(Character Streams)以Unicode字符为单位操作数据,适用于文本处理字节流(Byte…

黑马python(二十五)

目录:1.数据输出-输出为Python对象2.数据输出-输出到文件中3.综合案例1.数据输出-输出为Python对象2.数据输出-输出到文件中移动文件到文件夹:生成了好多文件,因为Rdd是有分区的 ,会把数据分散到各个分区去存储,因为电…

【LeetCode 热题 100】41. 缺失的第一个正数——(解法一)暴力解

Problem: 41. 缺失的第一个正数 题目:给你一个未排序的整数数组 nums ,请你找出其中没有出现的最小的正整数。 请你实现时间复杂度为 O(n) 并且只使用常数级别额外空间的解决方案。 文章目录整体思路完整代码时空复杂度时间复杂度:O(N log N)…

在运行 Laravel Sail 前,需安装 Docker Desktop 并完成基础配置/具体步骤

一、安装 Docker Desktop(必备环境) Windows 系统 (windows安装包 有两个版本) 架构版本查看 1. Win R‌ 输入 ‌cmd‌ 打开命令提示符; 2. ‌输入命令‌: bash echo %PROCESSOR_ARCHITECTURE% 3. ‌结果…

AI 应用于进攻性安全

一、引言 大语言模型(LLM)和 AI 智能体的出现推动进攻性安全变革,其在侦察、扫描、漏洞分析、利用、报告五个阶段展现出数据分析、代码生成、攻击场景规划等能力,能提升安全团队效率与扩展性,但存在 “幻觉” 等局限性…

微控制器中的EXTI0(External Interrupt 0)中断是什么?

微控制器中的EXTI0(External Interrupt 0)中断是什么? EXTI0(External Interrupt 0) 是微控制器(如STM32等ARM Cortex-M系列芯片)中的一个外部中断线,专门用于处理来自特定GPIO引脚的外部信号触发中断。以下是详细说明: 1. 基本概念 EXTI(External Interrupt/Event …

EasyGBS平台内置AI算法了,算法成为了视频平台的标配

今年五一的时候立了个flag(《国标GB28181平台EasyGBS未来研发方向在哪?》),我想不能再局限在只是满足于传统视频平台的功能,传统的EasyGBS也就是接入几种视频协议,什么RTSP、ONVIF、RTMP、GB28181这些&…

C# 常量与变量

在 C# 中,常量和变量是存储数据的基本方式: // 常量:使用 const 关键字声明,必须在声明时初始化,且值不能改变 const double Pi 3.14159; const string Message "Hello, World!"; ​ // 变量:…

TensorRT-LLM:大模型推理加速的核心技术与实践优势

大型语言模型推理就像让一头300公斤的大熊猫玩平衡木——显存消耗和计算效率这对双胞胎问题随时可能让表演翻车。以主流的7B参数模型为例,FP16精度下仅模型权重就吃掉14GB显存,这还没算上推理过程中不断膨胀的KV Cache——当处理2048长度的对话时&#x…

免费棱光 PDF:免安装 加水印 去水印 批量格式转换

各位办公小能手们,今天给大家介绍一款超棒的PDF处理工具——棱光PDF!它完全免费,专门解决咱对PDF文件的常见操作需求。绿色免安装,体积小得跟颗花生米似的,打开就能用。它有三大核心功能,分别是水印管理、格…

(二)复习(Error Pattern/Result Pattern/)

文章目录 项目地址一、Error Pattern1.1 定义Error类1. ErrorType 可发生的错误类型2. Error类3. ValidataionError1.2 给每个实体创建Error类1. CategoryError类2. TicketErrror类3. EventErrror类二、Result Pattern1.1 自定义返回Result1. 泛型类2. 泛型方法1.2 Api层的Resu…

20250705-day6

NATO:北大西洋公约组织 Software Crisis:软件危机 Paradigm:设计范型 Waterfall Model:瀑布模型 Prototype Model:原型模型(又称快速模型) Spiral Model:螺旋模型 Agile:…

视频播放中时钟的概念及音视频同步概念

author: hjjdebug date: 2025年 07月 05日 星期六 18:20:45 CST descrip: 视频播放中时钟的概念及音视频同步概念 文章目录 1.前言: 视频播放:1. 固定延时时间2. 根据frame的duration来延时.3. 根据frame的PTS 来播放3.1. 时钟是什么?3.2. 时钟的用途. 2.音视频同步: 1.前言: …

Python基础之字符串操作全解析

在 Python 中,字符串是最常用的数据类型之一,掌握字符串的各种操作对于日常编程至关重要。本文将详细介绍 Python 字符串的类型特性、编码转换、常用运算符及方法,帮助你全面掌握字符串处理技巧。 一、字符串的基本类型 Python 中的字符串属…

【爬虫】逆向爬虫初体验之爬取音乐

寻找数据 打开F12中的网络页面,播放音乐后,筛选媒体,会发现当前这首歌曲音频链接地址,打开后,点击“标头”就能能看到请求URL 截取“.mp3”前面的一部分进行搜索,搜索出来了很多数据包,但都是…

CppCon 2018 学习:Fancy Pointers for Fun and Profit

“Fancy Pointers for Fun and Profit” 这个标题听起来像是在讨论**“高级指针用法”**,尤其是在C里,如何利用智能指针、定制指针类型,或者其他高级指针技巧来写更安全、更高效、更优雅的代码。 可能的理解和内容方向: 1. 什么是…

思辨场域丨数字信号技术重塑农林牧渔:从“靠天吃饭”到“靠数吃饭”

凌晨三点,山东莱芜的养猪户老李被手机震动惊醒。屏幕显示:3号猪舍,母猪即将分娩。他轻点屏幕启动远程监控,翻身继续入睡——而在几年前,这样的夜晚他只能在猪圈里守着。 清晨的茶园里,兴业县的茶农王大姐掏…

文心大模型及百度大模型内容安全平台齐获信通院大模型安全认证

近日,文心大模型与百度大模型内容安全平台——红线大模型双双荣获中国信息通信研究院泰尔认证中心颁发的“大规模预训练模型(文本生成功能)安全认证证书”,且二者的认证级别皆“增强级”的最高级别。 大规模预训练模型&#xff08…