SpringBoot @Transactional事务不生效排查方式

 更新时间:2024年01月30日 08:39:38   作者:magic_kid_2010  
这篇文章主要介绍了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();

语句,手动回滚,这样上层就无需去处理异常。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • java实体类转json时null值不要转为"null"问题

    java实体类转json时null值不要转为"null"问题

    这篇文章主要介绍了java实体类转json时null值不要转为“null”问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-11-11
  • Java中反射的"暴破"机制(SetAccessible方法)详解

    Java中反射的"暴破"机制(SetAccessible方法)详解

    这篇文章主要为大家详细介绍了Java中反射的"暴破"机制,以及如何利用这一机制实现访问非公有属性,方法,和构造器,文中示例代码讲解详细,感兴趣的可以了解一下
    2022-08-08
  • springMVC向Controller传值出现中文乱码的解决方案

    springMVC向Controller传值出现中文乱码的解决方案

    这篇文章主要介绍了springMVC向Controller传值出现中文乱码的解决方案,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-02-02
  • SpringBoot使用@SpringBootTest注解开发单元测试教程

    SpringBoot使用@SpringBootTest注解开发单元测试教程

    这篇文章主要介绍了SpringBoot使用@SpringBootTest注解开发单元测试教程,本文通过详细的案例过程来说明如何使用该项技术,需要的朋友可以参考下
    2021-06-06
  • Java JUnit 使用及常用注解

    Java JUnit 使用及常用注解

    JUnit是Java开发中必不可少的测试框架之一,它可以帮助您编写高质量、可维护的单元测试,本文介绍了JUnit的基本用法、常用注解、测试套件和参数化测试等内容,希望对您的测试工作有所帮助,感兴趣的朋友一起看看吧
    2023-12-12
  • Spring Boot Mysql 数据库操作示例

    Spring Boot Mysql 数据库操作示例

    本篇文章主要介绍了Spring Boot Mysql 数据库操作示例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-02-02
  • SpringBoot整合JdbcTemplate的示例代码

    SpringBoot整合JdbcTemplate的示例代码

    JdbcTemplate是Spring框架自带的对JDBC操作的封装,目的是提供统一的模板方法使对数据库的操作更加方便、友好,效率也不错,这篇文章主要介绍了SpringBoot整合JdbcTemplate,需要的朋友可以参考下
    2022-08-08
  • 使用springboot对外部静态资源文件的处理操作

    使用springboot对外部静态资源文件的处理操作

    这篇文章主要介绍了使用springboot对外部静态资源文件的处理操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-08-08
  • java中double强制转换int引发的OOM问题记录

    java中double强制转换int引发的OOM问题记录

    这篇文章主要介绍了java中double强制转换int引发的OOM问题记录,本文给大家分享问题排查过程,感兴趣的朋友跟随小编一起看看吧
    2024-10-10
  • 零基础写Java知乎爬虫之抓取知乎答案

    零基础写Java知乎爬虫之抓取知乎答案

    上篇文章我们已经能把知乎的问题抓出来了,但是答案还木有抓出来。这一回合,我们就连着把答案也一起从网站中抠出来=。=
    2014-11-11

最新评论