Spring事务不生效的5个场景

本文详细分析了Spring事务在5种场景下可能失效的问题:非public方法、timeout超时、try/catch捕获异常、内部调用@Transactional方法及手动抛出检查异常。了解这些情况有助于在开发中正确处理事务。
摘要由CSDN通过智能技术生成

1.非 public 修饰的方法

当 @Transactional 修饰的方法为非 public 时,事务就失效了,比如以下代码当遇到异常之后,不能自动实现回滚:
在这里插入图片描述
此时表显示这条记录更新为0.31了,事务失效
在这里插入图片描述
同理,方法用final或statsic修饰,事务也是不生效的,因为在它的代理类中,就无法重写该方法,而添加事务功能

2.timeout 超时

当在 @Transactional 上,设置了一个较小的超时时间时,如果方法本身的执行时间超过了设置的 timeout 超时时间,那么就会导致本来应该正常更新数据的方法执行失败,示例代码如下:
在这里插入图片描述
正常应该更新为0.31,但是由于事务超时,导致没有更新成功,如下所示:
在这里插入图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
引用\[1\]:Spring事务的原理是通过@Transactional注解来配置事务的传播级别和异常处理方式。其中,@Transactional(propagation = Propagation.NOT_SUPPORTED)表示不支持事务,若存在事务则挂起;@Transactional(propagation = Propagation.NEVER)表示不使用事务,若存在事务则抛出异常。解决方案是使用Spring默认的传播级别(PROPAGATION_REQUIRED),或其他支持事务的传播级别。\[1\] 引用\[2\]:Spring事务默认支持RuntimeException异常,抛出的异常为RuntimeException异常及其子类异常事务均可生效。但若手动抛出Exception异常,而Exception是RuntimeException的父类,会导致事务不生效。解决方案有两种:一是指定Spring事务异常捕获类型@Transactional(rollbackFor = Exception.class),二是抛出Spring事务支持的异常类型throw new RuntimeException("手动抛出运行时异常")。\[2\] 引用\[3\]:Spring事务在后端开发中是非常常见的,它是保证数据一致性的基本保证。在Spring中,我们可以通过对方法进行事务的配置来实现事务操作,而不需要手动编写事务代码,这大大降低了开发的难度。然而,有时候我们会遇到事务不生效的问题。这篇文章针对这个问题进行了具体的分析和举例,总结了15种场景Spring事务不生效的原因和解决方案。\[3\] 问题: spring事务不生效的15种场景有哪些? 回答: Spring事务不生效的15种场景包括但不限于: 1. 使用了@Transactional注解但未开启事务; 2. 使用了try-catch块捕获了异常; 3. 方法没有被Spring容器管理; 4. 事务方法被同一个类中的其他非事务方法调用; 5. 事务方法被同一个类中的其他事务方法调用,但没有使用代理对象调用; 6. 事务方法被同一个类中的其他事务方法调用,但使用了不同的事务传播级别; 7. 事务方法被同一个类中的其他事务方法调用,但使用了不同的事务隔离级别; 8. 事务方法被同一个类中的其他事务方法调用,但使用了不同的事务超时时间; 9. 事务方法被同一个类中的其他事务方法调用,但使用了不同的事务只读属性; 10. 事务方法被同一个类中的其他事务方法调用,但使用了不同的事务回滚规则; 11. 事务方法被同一个类中的其他事务方法调用,但使用了不同的事务传播行为; 12. 事务方法被同一个类中的其他事务方法调用,但使用了不同的事务传播行为和事务隔离级别; 13. 事务方法被同一个类中的其他事务方法调用,但使用了不同的事务传播行为和事务超时时间; 14. 事务方法被同一个类中的其他事务方法调用,但使用了不同的事务传播行为和事务只读属性; 15. 事务方法被同一个类中的其他事务方法调用,但使用了不同的事务传播行为和事务回滚规则。\[3\] #### 引用[.reference_title] - *1* *2* [Spring事务不生效原因及解决方案](https://blog.csdn.net/secretdaixin/article/details/127805326)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [Spring事务不生效的原因](https://blog.csdn.net/t194978/article/details/123942493)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值