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

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.xdnf.cn/news/13424.html

相关文章:

  • 达梦数据库单机部署dmhs同步复制(dm8->kafka)
  • MFC 第1章:适配 WIndows 编程的软件界面调整
  • 如何诊断服务器硬盘故障?出现硬盘故障如何处理比较好?
  • 【沉浸式解决问题】Idea运行Junit测试中scanner无法获取控制台的输入内容
  • 山东大学软件学院项目实训-基于大模型的模拟面试系统-面试对话标题自动总结
  • 看安科瑞分布式光伏解决方案如何破解光伏痛点?
  • Python实战案例详解:基于计算器项目的扩展应用
  • 前端框架vue3的变化之处
  • API:解锁数字化协作的钥匙及开放实现路径深度剖析
  • HakcMyVM-Blackhat
  • Ubuntu 24.04 上安装与 Docker 部署 Sentinel
  • UE5 学习系列(六)导入资产包
  • BW非法字符处理
  • 智能空气流向控制系统SKLX的优化与实践
  • Hi3519DV500开发板适配新sensor的详细流程(最新版)
  • 96页PPT华为销售战略规划市场洞察品牌策略
  • Squid 代理服务器实战:解决动态 IP 访问第三方接口的生产级方案
  • 多系统合路器(POI)详解
  • 【数据结构】 优先级队列 —— 堆
  • 波形合成之C语言实现
  • NuGet 从入门到精进全解析
  • Intel Boot Guard
  • 系统集成自动化流程编排实现条件分支高级篇(二)
  • 实战使用docker compose 搭建 Redis 主从复制集群
  • 依存句法分析
  • Cockpit:一个开源的 Linux 系统管理工具
  • 蚁群算法(Ant Colony Optimization)原理与应用解析
  • (功能测试Charles)如何抓取手机http的报文
  • 2025神经网络动力学理论、优化算法及应用专题研讨会 ( NOTAA 2025)
  • 裸金属服务器+可信计算:构建自主可控的数据安全新底座