日常踩坑_添加了@Transactional注解后,事务不生效

故事梗概

事情是这样的,在使用Jpa的saveAll方法的时候,发现saveAll方法会进行先查询后保存的操作,但我只想要保存,不想要查询
关于saveAll的重写 可以这样用


    @PersistenceContext
    private EntityManager em;

    @Override
    public <t> void saveAll(Iterable<t> entities) {
        for (T entity : entities) {
            em.persist(entity);
        }
        em.flush();
        em.clear();
    }
</t></t>

完成了重写之后,发现数据存不进去,而且报错了: No EntityManager with actual transaction available for current thread
这个报错的原因是没有加事务,其实我在saveAll方法上加了 @Transactional注解的,但是并没有生效

一般的 @Transactional 不生效的原因

1、检查你的方法是不是public的,@Transactional注解只能应用到public可见度的方法上,如果应用在protected、private或者package可见度的方法上,也不会报错,不过事务设置不会起作用。
2、检查你的异常类型是不是unchecked异常。默认情况下,Spring会对unchecked异常进行事务回滚,如果是checked异常则不回滚。如空指针异常、算术异常等,会被回滚;文件读写、网络出问题,spring就没法回滚了。如果你想check异常也回滚怎么办,注解上面写明异常类型即可:
like this
@Transactional(rollbackFor = Exception.class)
3、是否在service中进行了try…catch的操作,由于已经被捕获异常,故事务也不会回滚。如果非要在service中try…catch异常,又想要事务回滚,可在catch块中抛出运行时异常

try{
    ....

}catch(Exception e){
    logger.error("",e);
    throw new RuntimeException;
}

这种方法有个不足之处,就是不能在catch块中存在return子句,若想捕获异常时回滚事务,同时返回提示信息,可以使用手动回滚:


try{
    ...

}catch(Exception e){
    logger.error("",e);
    TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
    return ERROR_MESSAGE;
}

PS:另外说明一下,在controller层捕获了service层的异常,事务还会回滚吗?答案是会的,只要你service层抛出了异常,并且你加的事务可以处理这个异常,也就是rollbackFor = Exception.class这个符合你抛出的异常,不管外面有没有捕获都可以回滚。
4、是否开启了对注解的解析:

<bean class="org.springframework.jdbc.datasource.DataSourceTransactionManager" id="transactionManager">
        <property name="dataSource" ref="dataSource">
</property></bean>
<tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true">
</tx:annotation-driven>

5、数据库引擎要支持事务,如果是mysql,注意表要使用支持事务的引擎,比如innodb,如果是myisam,事务是不起作用的。

6、spring是否扫描到你这个包,如下是扫描到org.test下面的包:
<context:component-scan base-package="org.test"></context:component-scan>

对我来说,以上都没用,哈哈
真实的原因是,@Transactional没加对地方,我把它加在了saveAll的方法上,但实际上我在save()方法中调用了一个create()方法,create()方法中才调用了saveAll()方法
诸位,看清这个关系 save()->create()->saveAll()*
那么@Transactional应该加在主方法save()上,而不是下面被调用的方法中
*

Original: https://www.cnblogs.com/deanCopy/p/16229636.html
Author: Dean_001
Title: 日常踩坑_添加了@Transactional注解后,事务不生效

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/580066/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • Java课程课堂作业代码

    本文章只是单纯记录课堂老师布置的课堂作业代码,题目都比较简单,所以没有写解题思路,相信大家都能理解,当然其中有的解法和代码不是最优的,当时只是为了完成题目,后来也懒得改了,如果有不…

    Java 2023年6月5日
    0203
  • Spring系列13:bean的生命周期

    本文内容 bean的完整的生命周期 生命周期回调接口 Aware接口详解 Spring Bean的生命周期 面试热题:请描述下Spring的生命周期? 4大生命周期 从源码角度来说…

    Java 2023年6月5日
    090
  • 线程通信

    404. 抱歉,您访问的资源不存在。 可能是网址有误,或者对应的内容被删除,或者处于私有状态。 代码改变世界,联系邮箱 contact@cnblogs.com 园子的商业化努力-困…

    Java 2023年6月7日
    074
  • 反射、注解、动态代理的理解

    反射 反射的核心就是拿到了.java编译后的.class文件。通过一系列的API,可以拿到该类中的成员:构造器、属性、方法等。 注解 注解,可以告诉编译器或者JVM做一些事情。比如…

    Java 2023年6月15日
    068
  • 栈区和堆区

    在编写程序中,会创建许许多多的变量,访问一个变量靠的是访问变量的地址,如果不记住变量地址,就无法对该变量进行操作,内存空间有限,如果变量过多不可能把所有的变量地址都保存下来,这样一…

    Java 2023年6月5日
    096
  • MySQL实现表之间的字段更新

    新功能写好之后,需要把以前表数据更新一下,字段数据从以前的表中获取,只更新两个字段 UPDATE TABLE1,TABLE2 SET TABLE1.COLUMN1 = TABLE2…

    Java 2023年6月8日
    073
  • ASP.NET MCV的模式框架应用基础知识(一)

    1.1 ASP.NET MVC 简介 今天我们来了解一下ASP.NET MCV的基础知识,ASP.NET是一种构建Web应用程序的框架,它将通常的MVC(Model-View-Co…

    Java 2023年6月9日
    088
  • JAVA的类加载过程

    我们详细讲解一下Java虚拟机中类加载的全过程,也就是加载、验证、准备、解析和初始化这5个阶段所执行的具体动作。 一、加载“加载”是”类加载&#…

    Java 2023年5月29日
    085
  • 52类110个主流的Java框架

    上次写了一篇讲 Java 工具的文章。 有读者看完在微信问我,能不能总结一个更全的 Java 主流框架? 我本以为整理这个没多难,后来一边整理一边感觉越来越多…&#82…

    Java 2023年6月7日
    066
  • JavaWeb 多个Servlet整合优化

    JavaWeb 多个Servlet整合优化 由于一个Servlet只能接收一个地址的http请求,如果系统复杂度提高,就会有很多Servlet类。例如,对销售系统来说,可能会有Oe…

    Java 2023年6月8日
    098
  • java8 .stream().filter() 代替for循环 lambda表达式

    先说一下lambda表达式:lambda 表达式的语法格式如下:(parameters) -> expression (parameters) ->{ statemen…

    Java 2023年5月29日
    075
  • JDK新特性(总索引)

    前言 目录 posted @2021-08-01 11:46 侯小厨 阅读(62 ) 评论() 编辑 Original: https://www.cnblogs.com/houzh…

    Java 2023年5月30日
    076
  • Spring Boot常见配置及错误

    一、SpringBoot常见配置 (1)SpingBoot与MyBatis集成时跟踪SQL语句 (2)日志跟踪 (3)MyBatis集成: Mapper所在路径不需要配置,系统会自…

    Java 2023年5月30日
    060
  • maven bug解决

    [ERROR] Failed to execute goal on project cloud-consumer-feign-order80: Could not resolve …

    Java 2023年6月15日
    0115
  • mybatis-generator生成domain和mapper,以及example的使用

    一:生成 1.效果 其中,domain,mapper等文件夹与文件都是插件生成 2.pom

    Java 2023年5月30日
    093
  • JavaScript基础知识

    undefined window.alert() –写入警告框 document.write()—写入HTML输出 console.log()—写入浏览器控制台 aler…

    Java 2023年6月5日
    081
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球