SpringBoot @Transactional事务不生效排查方式
问题描述
在开发Spring Boot项目时,方法使用了@Transactional注解,但是当方法抛出异常时,数据没有回滚。
解决方法
经排查,发现是数据库引擎搞的鬼。
之前在建mysql数据库表的时候,忘记修改表使用的引擎,引擎使用的是MyISAM,而MyISAM是不支持事务的,只需将引擎改为InnoDB即可。
排查步骤
当@Transactional事务不生效的时候,可以遵循以下排查步骤:
1、查看数据库或表,设置的引擎。MyISAM是不支持事务的,必须改为InnoDb。
2、@Transactional注解的方法是否为public。如果应用在protected、private或者 package的方法上,不会报错,但是事务设置不会起作用。
3、@Transactional所注解的方法所在的类,是否已经使用了注解@Service或@Component等。
4、需要调用该方法,且需要支持事务特性的调用方,是在 @Transactional所在的类的外面。
注意:类内部的其他方法调用这个注解了@Transactional的方法,事务是不会起作用的。
5、注解为事务范围的方法中,事务的回滚仅仅对于unchecked的异常有效。对于checked异常无效。也就是说事务回滚仅仅发生在出现RuntimeException或Error的时候。
那么什么是checked异常呢?
java里面将派生于Error或者RuntimeException(比如空指针,1/0)的异常称为unchecked异常,其他继承自java.lang.Exception得异常统称为Checked Exception,如IOException、TimeoutException等
通俗一点就是:
- 代码中出现的空指针等异常,会被回滚。
- 而文件读写、网络超时问题等,spring就没法回滚了。
unchecked异常,回滚解决办法
方法一
手动回滚。
给注解加上参数如:
@Transactional(rollbackFor=Exception.class)
方法二
如上述分析。
对uncheck异常进行catch,然后抛出RuntimeException异常。
方法三
在service层方法的catch语句中增加:
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
语句,手动回滚,这样上层就无需去处理异常。
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
相关文章
SpringBoot下获取resources目录下文件的常用方法
本文详细介绍了SpringBoot获取resources目录下文件的常用方法,包括使用this.getClass()方法、ClassPathResource获取以及hutool工具类ResourceUtil获取,感兴趣的可以了解一下2024-10-10
IDEA2020.1启动SpringBoot项目出现java程序包:xxx不存在
这篇文章主要介绍了IDEA2020.1启动SpringBoot项目出现java程序包:xxx不存在,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧2020-06-06
UniApp + SpringBoot 实现支付宝支付和退款功能
这篇文章主要介绍了UniApp + SpringBoot 实现支付宝支付和退款功能,基本的 SpringBoot 的脚手架,可以去IDEA 自带的快速生成脚手架插件,本文通过实例代码给大家介绍的非常详细,需要的朋友参考下吧2022-06-06
Springboot 整合 Java DL4J 实现农产品质量检测系统(推荐)
本文详细介绍了系统的搭建过程,包括技术选型、数据处理、模型训练和评估等关键步骤,系统采用卷积神经网络,对水果成熟度和缺陷进行识别,有效解决了传统方法成本高、效率低的问题,有助于提升农产品检测的科技含量和自动化水平2024-10-10
Spring中自带的@Schedule实现自动任务的过程解析
这篇文章主要介绍了关于Spring中自带的@Schedule实现自动任务,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下2023-06-06
spring security在分布式项目下的配置方法(案例详解)
这篇文章主要介绍了spring security在分布式项目下的配置方法,本文通过一个项目案例给大家详细介绍,通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下2020-10-10
java多线程编程之InheritableThreadLocal
这篇文章主要为大家详细介绍了java多线程编程之InheritableThreadLocal,具有一定的参考价值,感兴趣的小伙伴们可以参考一下2017-10-10
RequestContextHolder.getRequestAttributes()空指针问题及解决
这篇文章主要介绍了RequestContextHolder.getRequestAttributes()空指针问题及解决,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教2024-01-01


最新评论