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();

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

总结

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

相关文章

  • SpringBoot如何整合Springsecurity实现数据库登录及权限控制

    SpringBoot如何整合Springsecurity实现数据库登录及权限控制

    这篇文章主要给大家介绍了关于SpringBoot如何整合Springsecurity实现数据库登录及权限控制的相关资料,文中通过图文以及实例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2022-01-01
  • Nacos注册中心的部署与用法示例详解

    Nacos注册中心的部署与用法示例详解

    注册中心是微服务架构中的纽带,类似于“通讯录”,它记录了服务和服务地址的映射关系,本文通过示例代码给大家介绍Nacos注册中心的部署与用法,感兴趣的朋友跟随小编一起看看吧
    2022-02-02
  • SpringBoot项目实现通过分词器生成词云

    SpringBoot项目实现通过分词器生成词云

    本文介绍了如何在SpringBoot项目中利用IK分词器和Kumo库生成员工任务的词云图,展示了从引入依赖、配置YAML到Controller中处理文本并生成词云的详细步骤以及处理中文文本的注意事项,希望对大家有所帮助
    2026-05-05
  • Shiro 控制并发登录人数限制及登录踢出的实现代码

    Shiro 控制并发登录人数限制及登录踢出的实现代码

    本文通过shiro实现一个账号只能同时一个人使用,本文重点给大家分享Shiro 控制并发登录人数限制及登录踢出的实现代码,需要的朋友参考下吧
    2017-09-09
  • Java实现List与数组互转(Arrays.asList与Collectors.toList)的两种方法

    Java实现List与数组互转(Arrays.asList与Collectors.toList)的两种方法

    在 Java 编程中,List 和数组(Array)是两种常用的数据结构,本文将深入探讨 List 与数组之间的相互转换,重点介绍 Arrays.asList 和 Collectors.toList 这两种常用且重要的方法,并分析它们的特点、适用场景及注意事项,需要的朋友可以参考下
    2026-01-01
  • SpringBoot3中使用虚拟线程的详细过程

    SpringBoot3中使用虚拟线程的详细过程

    虚拟线程主要解决的问题是减少I/O密集型任务的I/O阻塞,这篇文章主要介绍了SpringBoot3中使用虚拟线程的详细过程,需要的朋友可以参考下
    2025-06-06
  • JVM优先级线程池做任务队列的实现方法

    JVM优先级线程池做任务队列的实现方法

    这篇文章主要介绍了JVM优先级线程池做任务队列的实现方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-08-08
  • SpringBoot使用JPA实现查询部分字段

    SpringBoot使用JPA实现查询部分字段

    这篇文章主要介绍了SpringBoot使用JPA实现查询部分字段方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-08-08
  • 使用webservice自定义注解处理参数加解密问题

    使用webservice自定义注解处理参数加解密问题

    这篇文章主要介绍了使用webservice自定义注解处理参数加解密问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-12-12
  • Java接入常用大模型API的实战对比

    Java接入常用大模型API的实战对比

    这篇文章主要为大家详细介绍了Java接入常用大模型API的实战对比,主要是Ollama(本地),阿里云通义千问,OpenAI和豆包 Coze,文中的示例代码讲解详细,感兴趣的小伙伴可以了解下
    2026-04-04

最新评论