Spring声明式事务生效是有条件滴!

在日常工作中,经常使用@Transactional 注解进行事务的声明,但如果发现事务未生效,可以从下面几个方面进行排查。


常见失效场景总结

场景原因解决方案
内部方法调用绕过了Spring代理注入自身或使用AopContext
private方法AOP无法增强改为public方法
final方法/类无法被代理移除final修饰符
非Spring管理不是代理对象确保Bean由Spring管理
异常被捕获异常未抛出到代理层检查异常处理逻辑
数据库不支持如MyISAM引擎使用InnoDB等支持事务的引擎

1、配置事务管理器

在服务的启动类,需要配置@EnableTransactionManagement,核心作用是启用Spring的声明式事务管理功能

在Spring Boot中,通常不需要显式添加@EnableTransactionManagement;但如果exclude = {DataSourceAutoConfiguration.class}排除了DataSource自动配置,则需要显式声明

@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class}) // 排除是由于项目需要,需要声明多数据源
@EnableTransactionManagement  // 激活事务管理
public class Application {// 启用后,Spring会为带有@Transactional的Bean创建代理
}

或者可以使用XML配置方式配置

<tx:annotation-driven transaction-manager="transactionManager"/>

2、代理机制生效

// ❌ 错误:内部方法调用,事务不生效
@Service
public class UserService {@Transactionalpublic void methodA() {// 直接调用内部方法,事务失效this.methodB();}@Transactionalpublic void methodB() {// 事务不会生效}
}// ✅ 正确:通过Spring代理调用
@Service
public class UserService {@Autowiredprivate UserService self; // 注入自己或通过ApplicationContext获取@Transactionalpublic void methodA() {// 通过代理调用,事务生效self.methodB();}@Transactionalpublic void methodB() {// 事务生效}
}

3、异常类型匹配

@Transactional(rollbackFor = Exception.class)
public String createTask(ModelTaskDTO modelTaskDTO) throws TException, InterruptedException {// 所有异常都会回滚
}// 默认情况只回滚RuntimeException和Error
@Transactional // 只回滚RuntimeException
public void defaultRollback() {throw new IOException(); // 不会回滚
}

4、方法修饰符要求

public class ModelTrainingServiceImpl {// ✅ 正确:public方法@Transactionalpublic String createTask() {// 事务生效}// ❌ 错误:private方法事务不生效@Transactionalprivate void privateMethod() {// 事务不生效}// ❌ 错误:final方法无法被代理@Transactionalpublic final void finalMethod() {// 事务不生效}
}

5、Bean必须由Spring管理

// ✅ 正确:Spring管理的Bean
@Service
public class ModelTrainingServiceImpl {@Transactionalpublic void method() {// 事务生效}
}// ❌ 错误:手动new的对象
ModelTrainingServiceImpl service = new ModelTrainingServiceImpl();
service.method(); // 事务不生效

6、数据库支持事务

  • 使用支持事务的数据库引擎(如MySQL的InnoDB)

  • 正确配置数据源和连接

7、事务传播行为

@Service
public class YourService {@Transactional(propagation = Propagation.REQUIRED)public void method1() {// 默认传播行为}@Transactional(propagation = Propagation.REQUIRES_NEW)public void method2() {// 总是开启新事务}
}

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

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

相关文章

Code Composer Studio快捷键

文本编辑 编辑、查找、替换功能快捷键 功能快捷键撤销CutZ重做CutY剪切CtrlX复制CtrlC粘贴CtrlV删除Delete全选CtrlA代码块选中AltShiftA查找、替换Ctrl F查找下一个匹配的字符串CtrlK查找上一个匹配的字符串CtrlShiftK查看接口注释&#xff08;文档&#xff09;F2查看函数帮…

从认识AI开始-----生成对抗网络(GAN):通过博弈机制,引导生成

前言 生成对抗网络&#xff08;GAN&#xff09;是lan J. Goodfellow团队在2014年提出的生成架构&#xff0c; 该架构自诞生起&#xff0c;就产生了很多的话题&#xff0c;更是被称为生成对抗网络是“新世纪以来机器学习领域内最有趣的想法”。如今&#xff0c;基于生成对抗网络…

限流算法java实现

参考教程&#xff1a;2小时吃透4种分布式限流算法 1.计数器限流 public class CounterLimiter {// 开始时间private static long startTime System.currentTimeMillis();// 时间间隔&#xff0c;单位为msprivate long interval 1000L;// 限制访问次数private int limitCount…

Maven 构建性能优化深度剖析:原理、策略与实践

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家&#xff0c;历代文学网&#xff08;PC端可以访问&#xff1a;https://literature.sinhy.com/#/?__c1000&#xff0c;移动端可微信小程序搜索“历代文学”&#xff09;总架构师&#xff0c;15年工作经验&#xff0c;精通Java编…

JS手写代码篇---手写深拷贝

17、深拷贝 深拷贝与浅拷贝最大的不同就是对象的属性是嵌套对象&#xff0c;会新建一个对象 步骤&#xff1a; 判断是否为对象判断是否为i数组或者对象&#xff0c;给新的有个容器遍历循环&#xff0c;如果是对象要遍历循环&#xff0c;采用递归 function deepCopy(obj){// …

【react实战】如何实现监听窗口大小变化

在日常开发场景中&#xff0c;监听窗口变化是一个比较常见又很重要的业务功能&#xff0c;其实实现起来也很简单&#xff0c;今天就来记录一下具体的实现以及注意事项。 实现思路 在 React 中&#xff0c;可以通过监听 window 的 resize 事件来检测可视区域&#xff08;viewp…

AVCap视频处理成帧和音频脚本

###############处理原视频&#xff0c;使其格式和原数据一样 import os import cv2 import subprocess import json from PIL import Image from pydub import AudioSegmentimport sys import shutil # &#x1f539; 第一步&#xff1a;强制检测并设置FFmpeg路径 &#x1f5…

数据冗余对企业运营的隐性成本

从客户管理到供应链优化&#xff0c;再到市场分析&#xff0c;数据无处不在&#xff0c;数据已成为企业运营的核心驱动力。然而&#xff0c;随着企业IT系统的多样化和数据量的激增&#xff0c;数据冗余&#xff08;Data Redundancy&#xff09;问题逐渐浮出水面&#xff0c;成为…

HTML原生日期插件增加周次显示

<div id="app" class="box box-info" style="border-top-color:white;"><!-- // 日期部分 --><div class="date-picker-container" style="position: relative; max-width: 200px;"><!-- 日期输入框 -…

渗透测试PortSwigger Labs:遭遇html编码和转义符的反射型XSS

1 处是我们输入的标签被服务器 html 编码后返回&#xff0c;被浏览器当作字符串显示出来&#xff0c;无法执行 javascript 2 处是唯一能控制的地方&#xff0c;正好在script标签范围内&#xff0c;可以尝试构造 依然存在转移单引号&#xff0c;我们输入转义符\让服务器添加的转…

Ansible 错误处理:确保高效自动化

当 Ansible 收到命令的非零返回码或模块故障时,默认情况下,它会停止在该主机上的执行,并在其他主机上继续执行。但是,在某些情况下,您可能需要不同的行为。有时非零返回码表示成功。有时您希望一台主机上的故障导致所有主机上的执行停止。Ansible 提供了处理这些情况的工具…

【无标题】NP完全问题的拓扑对偶统一解法 ——四色问题到P=NP的普适框架

NP完全问题的拓扑对偶统一解法 ——四色问题到PNP的普适框架 **摘要** 本文提出基于**拓扑膨胀-收缩对偶性**的计算理论框架&#xff0c;突破传统NP完全性理论局限。通过将离散组合问题转化为连续几何问题&#xff0c;并引入规范场量子求解机制&#xff0c;实现四色问题、子…

【Zephyr 系列 19】打造 BLE 模块完整 SDK:AT 命令系统 + 状态机 + NVS + OTA 一体化构建

🧠关键词:Zephyr、BLE 模块、SDK 构建、AT 命令框架、有限状态机、Flash 配置、MCUboot OTA 📌面向读者:希望将 BLE 项目标准化、封装化、支持量产使用的开发团队与架构师 📊预计字数:5500+ 字 🧭 背景与目标 在完成多个 BLE 功能模块后,一个企业级产品往往需要:…

机器学习核心概念速览

机器学习基本概念 有监督学习分类、回归无监督学习聚类、降维 一维数组 import numpy as np data np.array([1,2,3,4,5]) print(data) print(data.shape) print(len(data.shape))[1 2 3 4 5] (5,) 1二维数组 data2 np.array([[1,2,3],[4,5,6]]) print(data2) print(data2…

在 Java 中实现一个标准 Service 接口,并通过配置动态选择具体实现类供 Controller 调用

在 Java 中实现一个标准 Service 接口&#xff0c;并通过配置动态选择具体实现类供 Controller 调用&#xff0c;是解耦和灵活扩展的常见设计模式。 需求分析 当你需要开发一个需要灵活切换业务实现的系统&#xff0c;比如不同环境使用不同策略&#xff08;如测试环境用Mock实…

input+disabled/readonly问题

背景&#xff1a; vue2elementui <el-input v-model"inputForm.projectName" class"input-font" :disabled"projectDisabled" placeholder"请选择" :readonly"isReadonly"><el-button slot"append"…

Office2019下载安装教程(2025最新永久方法)(附安装包)

文章目录 Office2019安装包下载Office2019一键安装步骤&#xff08;超详细&#xff01;&#xff09; 大家好&#xff01;今天给大家带来一篇超实用的Office2019专业版安装教程&#xff01;作为日常办公和学习的必备软件&#xff0c;Office的安装对很多朋友来说可能有点复杂&…

【编译工具】(版本控制)Git + GitHub Actions:自动化工作流如何让我的开发效率提升200%?

目录 引言&#xff1a;现代开发中版本控制和 CI/CD 的重要性 一、Git&#xff1a;为什么它是版本控制的首选&#xff1f; &#xff08;1&#xff09;Git 的核心优势 &#xff08;2&#xff09;Git 高效工作流示例 ① 功能开发流程 ② 紧急修复流程 二、GitHub Acti…

码蹄杯真题分享

我的个人主页 我的专栏&#xff1a; 人工智能领域、java-数据结构、Javase、C语言&#xff0c;MySQL&#xff0c;希望能帮助到大家&#xff01;&#xff01;&#xff01; 点赞&#x1f44d;收藏❤ 1&#xff1a;房间打扫&#xff08;题目链接&#xff09; 思路&#xff1a;要想…

小米玄戒O1架构深度解析(二):多核任务调度策略详解

上篇文章中&#xff0c;就提到了小米玄戒O1的多核任务调度策略&#xff0c;但讲得不够详细&#xff0c;尤其是对于完全公平调度器和能效感知调度&#xff0c;这次我们就深度剖析一下这两种调度策略。 目录 1. 完全公平调度器&#xff08;CFS&#xff09;1.1 完全公平调度基本原…