精华内容
下载资源
问答
  • 主要介绍了Java注解@Transactional事务类内调用不生效问题及解决办法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
  • @Transactional注解只能应用到public可见度的方法上,如果应用在protected、private或者package可见度的方法上,也不会报错,不过事务设置不会起作用。 2、检查你的异常类型是不是unchecked异常。默认情况下,Spring...

    1、检查你的方法是不是public的。@Transactional注解只能应用到public可见度的方法上,如果应用在protected、private或者package可见度的方法上,也不会报错,不过事务设置不会起作用。

    2、检查你的异常类型是不是unchecked异常。默认情况下,Spring会对unchecked异常进行事务回滚,如果是checked异常则不回滚。如空指针异常、算术异常等,会被回滚;文件读写、网络出问题,spring就没法回滚了。如果你想check异常也回滚怎么办,注解上面写明异常类型即可:

    @Transactional(rollbackFor = Exception.class)
    

    类型的还有norollbackFor,自定义不回滚的异常。

    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"/>
    </bean>
    <tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true"/>
    

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

    6、spring是否扫描到你这个包,如下是扫描到org.test下面的包:

    <context:component-scan base-package="org.test" ></context:component-scan>
    

    7、检查是不是同一个类中的方法调用(如A方法无@Transactional注解,调用了一个有@Transactional注解的方法),这样事务也是不生效的。

    展开全文
  • 2.在主方法(无@Transactional注解的方法)调用@Transactional事务注解子方法时,子方法的事务失效,注:事务可传递,在主方法上加@Transactional即可,如果子方法在其他地方也有调用,都加上也可以 3.@...

    1.没有配置事务管理器。

    2.在主方法(无@Transactional注解的方法)调用@Transactional事务注解子方法时,子方法的事务失效,注:事务可传递,在主方法上加@Transactional即可,如果子方法在其他地方也有调用,都加上也可以

    3.@Transactional注解只能应用到 public 修饰的方法

    4.数据库引擎不支持事务导致事务不生效

    5.对check类型不生效,check类型异常这样注释@Transactional(rollbackOn = Exception.class)。

      换句话就是只对uncheck类型生效,运行异常。非RuntimeException不生效

    展开全文
  • SpringBoot @Transactional 注解生效

    千次阅读 2019-11-27 22:18:35
    @Transactional 注解生效的原因1. 数据库引擎支持事务2. @Transactional 修饰非 public 方法3. @Transactional 修饰的方法未通过接口调用4. @Transactional 修饰的方法内部捕获异常 1. Spring 中使用事务管理的...

    1. SpringBoot 中使用事务的正确方式

    Spring 框架中,要让框架自动管理事务需要显式使用 @EnableTransactionManagement注解,但是SpringBoot 的自动配置机制已经在org.springframework.boot.autoconfigure.transaction.TransactionAutoConfiguration 中启用了该注解,故不再需要在启动类上添加这个注解。这样在 SpringBoot 中只要@Transactional 注解方法就表明开启了自动事务管理,其正确的使用方式如下

    1. 声明接口方法 Service

      public interface Service {
          void updateResult(String req);
      }
      
    2. ServiceImpl 接口方法实现上添加注解

      public class ServiceImpl implements Service{
         // 该对象为数据库操作实例,具体实现此处不表
        @Autowired
        private ResultRepository mResultRepository;
        
        @Transactional
        @Override
        public void updateResult(String req) {
            mResultRepository.update(req);
        }
      }
      
    3. ResultController 中通过 spring 自动注入的 Service 对象来调用 updateResult() 方法,即可实现事务管理

      @RestController
      public interface ResultController {
      
       @Autowired
       private Service service;
       
       @GetMapping(value = "result/update")
       public void updateResult(String req) {
           service.updateResult(req);
       }
      }
      

    2. @Transactional 注解未生效的原因

    2.1 数据库引擎不支持事务

    数据库事务是基于数据库引擎的,使用事务首先要保证数据库引擎支持事务。以 MySQL 为例,InnoDB 引擎支持事务,而 MyISAM 引擎不支持事务,这个盲点有时会产生很多不必要的问题

    2.2 @Transactional 修饰的方法未通过接口调用

    Spring 是采用 AOP 的方式来执行事务的,事务要生效那么AOP必须生效。Spring 中 AOP 实现方式可参考短文 AOP 的实现方式,其两种实现 JDK 动态代理CGLIB 生成子类 原理都是在目标方法的外部包装一层逻辑,这样在外部调用的时候流程为 代理类方法-->目标方法,AOP的增强就生效了。当对象内部方法互相调用,其流程表述为 代理类方法1-->目标方法1-->目标方法2目标方法2 的增强逻辑根本不会被调用,自然AOP 就失效了

    2.3 @Transactional 修饰的方法内部捕获异常

    方法内部使用 try/catch,异常未被抛出,不会回滚。Spring 自动事务管理通过方法是否抛出异常来决定执行提交还是回滚,默认只有 RuntimeException 才会回滚,但是这个异常范围有点小,rollbackFor 参数指定为 Exception.class 是很有必要的

    2.4 @Transactional 多数据源环境下未指定 transactionManager 参数

    多数据源环境下如果没有指定 transactionManager 参数,默认的 transactionManager 一般是主库的事务管理器,而如果期望的事务操作不是在主库中,发生错误是显而易见的。另外如果一个事务中涉及到了多个数据库,Spring中的自动事务管理是无法正常进行的,因为当前数据库A操作完之后,Spring 框架会复用已有的数据库连接去操作另一个数据库B,这样大部分情况下就会报出表不存在之类的错误

    • 分布式事务可借助其他工具实现,例如 atomikos

    3. 解决方案

    3.1 自动管理事务

    使用 @Transactional 注解内部调用事务失效的原因就是AOP 失效,但是使用 AopContext.currentProxy()来获取代理对象再调用其事务方法被笔者证明可使AOP生效,但是无法使事务生效 ,具体原因有待进一步分析。不过无数的经验证明,仅凭技术无法实现的能力,通常可以通过改变结构来实现。以下两种解决方案笔者更倾向于第一种在 Controller 中重新组织 Service 调用的方式,第二种将数据库操作组合下沉到仓储层的做法在业务复杂时会不可避免地混入业务逻辑,与分层思想有一定出入

    3.1.1 将 Service 服务调用组织到 Controller 中

    采用上文SpringBoot中使用事务的正确方式的例子 ,如果在 ServiceImpl 将其重写的updateResult()方法分拆成了两部分,一部分是其他逻辑,一部分是更新数据库。显而易见的,添加在内部调用方法 updateRepository()上的事务注解不会生效。这时候一个解决的思路就是,将 updateRepository()方法向上抽取到 Service接口中,将其暴露为外部接口,然后在 Controller 里面重新组织Service 方法的调用流程。例如之前在 Controller 中只调用了service.updateResult(req),现在可以组织调用为 service.updateResult(req);service.updateRepository(req);

    在这里插入图片描述

    public class ServiceImpl implements Service{
      @Autowired
      private ResultRepository mResultRepository;
      
      @Override
      public void updateResult(String req) {
      // 1. 其他逻辑
      ······
      // 2. 更新数据库
          updateRepository(req);
      }
    
      @Transactional
      public void updateRepository(String req) {
          mResultRepository.update(req);
      }
    }
    

    3.1.2 将数据库的操作组合下沉到仓储层 Repository 中

    在业务代码中,事务表现比较突出的特性为原子性。通常一个 Dao 接口对应一个数据表 Mapper,但有时我们也可以使用一个聚合的 Dao 接口,使其实现类包含多个数据表 Mapper,并将多个 Mapper 的操作封装在同一个接口方法实现中,这样使用 @Transactional 注解来修饰这个实现方法就能达到事务效果

    在这里插入图片描述

    3.2 手动管理事务

    手动事务就是在代码中显式地进行事务操作,与上古时代基于 Java 原生 API 手动管理数据库连接的开发模式完全相同,不过认真说起来即便是那会大部分事务也是通过 Filter 过滤器把数据库连接 DataConnection 放在 ThreadLocal 实现,实现可参考 TransactionFilter。SpringBoot 中手动事务的使用方法如下,需注意此处注入的 DataSourceTransactionManager默认的数据源的事务管理器,如果在多数据源环境下,需要为每个数据源都配置一个事务管理器,然后注入的时候根据数据源指定其事务管理器

    // 注入如下两个对象
    @Resource
    DataSourceTransactionManager dataSourceTransactionManager;
    @Autowired
    TransactionDefinition transactionDefinition;
    
    public void update(){
        //开启事务
        TransactionStatus transactionStatus = dataSourceTransactionManager.getTransaction(transactionDefinition);
        try{
            this.update();
            //无异常,提交事务
            dataSourceTransactionManager.commit(transactionStatus);
        }catch(Exception e){
            //异常,回滚事务
            dataSourceTransactionManager.rollback(transactionStatus);
        }
    }
    
    展开全文
  • 引言@Transactional注解哪些场景下会失效,一时语塞致使面试失败。所以今天简单的和大家分享一下@Transactional相关的知识。@Transactional 注解相信大家并陌生,平时开发中很常用的一个注解,它能保证方法内多个...

    98adbd10e78458a1b32d4e891c64e5fc.png

    引言

    @Transactional注解哪些场景下会失效,一时语塞致使面试失败。所以今天简单的和大家分享一下@Transactional相关的知识。

    @Transactional 注解相信大家并不陌生,平时开发中很常用的一个注解,它能保证方法内多个数据库操作要么同时成功、要么同时失败。使用@Transactional注解时需要注意许多的细节,不然你会发现@Transactional总是莫名其妙的就失效了。

    一、事务

    事务管理在系统开发中是不可缺少的一部分,Spring提供了很好事务管理机制,主要分为编程式事务和声明式事务两种。

    编程式事务:是指在代码中手动的管理事务的提交、回滚等操作,代码侵入性比较强,如下示例:

    try {

    声明式事务:基于AOP面向切面的,它将具体业务与事务处理部分解耦,代码侵入性很低,所以在实际开发中声明式事务用的比较多。声明式事务也有两种实现方式,一是基于TX和AOP的xml配置文件方式,二种就是基于@Transactional注解了。

    @Transactional

    二、@Transactional介绍

    1、@Transactional注解可以作用于哪些地方?

    @Transactional 可以作用在接口、类、类方法。

    作用于类:当把@Transactional 注解放在类上时,表示所有该类的public方法都配置相同的事务属性信息。

    作用于方法:当类配置了@Transactional,方法也配置了

    @Transactional,方法的事务会覆盖类的事务配置信息。

    作用于接口:不推荐这种使用方法,因为一旦标注在Interface上并且配置了Spring AOP 使用CGLib动态代理,将会导致@Transactional注解失效

    @Transactional

    2、@Transactional注有哪些属性?

    propagation属性

    propagation 代表事务的传播行为,默认值为 Propagation.REQUIRED,其他的属性信息如下:

    Propagation.REQUIRED:如果当前存在事务,则加入该事务,如果当前不存在事务,则创建一个新的事务。( 也就是说如果A方法和B方法都添加了注解,在默认传播模式下,A方法内部调用B方法,会把两个方法的事务合并为一个事务 )

    Propagation.SUPPORTS:如果当前存在事务,则加入该事务;如果当前不存在事务,则以非事务的方式继续运行。

    Propagation.MANDATORY:如果当前存在事务,则加入该事务;如果当前不存在事务,则抛出异常。

    Propagation.REQUIRES_NEW:重新创建一个新的事务,如果当前存在事务,暂停当前的事务。

    ( 当类A中的 a 方法用默认Propagation.REQUIRED模式,类B中的 b方法加上采用 Propagation.REQUIRES_NEW模式,然后在 a 方法中调用 b方法操作数据库,然而 a方法抛出异常后,b方法并没有进行回滚,因为Propagation.REQUIRES_NEW会暂停 a方法的事务 )

    Propagation.NOT_SUPPORTED:以非事务的方式运行,如果当前存在事务,暂停当前的事务。

    Propagation.NEVER:以非事务的方式运行,如果当前存在事务,则抛出异常。

    Propagation.NESTED :和 Propagation.REQUIRED 效果一样。

    isolation 属性

    isolation :事务的隔离级别,默认值为 Isolation.DEFAULT。

    Isolation.DEFAULT:使用底层数据库默认的隔离级别。

    Isolation.READ_UNCOMMITTED

    Isolation.READ_COMMITTED

    Isolation.REPEATABLE_READ

    Isolation.SERIALIZABLE

    timeout 属性

    timeout :事务的超时时间,默认值为 -1。如果超过该时间限制但事

    务还没有完成,则自动回滚事务。

    readOnly 属性

    readOnly :指定事务是否为只读事务,默认值为 false;为了忽略那些不需要事务的方法,比如读取数据,可以设置 read-only 为 true。

    rollbackFor 属性

    rollbackFor :用于指定能够触发事务回滚的异常类型,可以指定多个异常类型。

    noRollbackFor属性**

    noRollbackFor:抛出指定的异常类型,不回滚事务,也可以指定多个异常类型。

    二、@Transactional失效场景

    接下来我们结合具体的代码分析一下哪些场景下,@Transactional 注解会失效。

    1、@Transactional 应用在非 public 修饰的方法上

    如果Transactional注解应用在非public 修饰的方法上,Transactional将会失效。

    d0c1c04d0f428ead45c5cbaf3687f9be.png

    之所以会失效是因为在Spring AOP 代理时,如上图所示 TransactionInterceptor (事务拦截器)在目标方法执行前后进行拦截,DynamicAdvisedInterceptor(CglibAopProxy 的内部类)的 intercept 方法或 JdkDynamicAopProxy 的 invoke 方法会间接调用 
    AbstractFallbackTransactionAttributeSource的 
    computeTransactionAttribute 方法,获取Transactional 注解的事务配置信息。

    protected TransactionAttribute computeTransactionAttribute(Method method,

    此方法会检查目标方法的修饰符是否为 public,不是 public则不会获取@Transactional 的属性配置信息。

    注意:protected、private 修饰的方法上使用 @Transactional 注解,虽然事务无效,但不会有任何报错,这是我们很容犯错的一点。

    2、@Transactional 注解属性 propagation 设置错误

    这种失效是由于配置错误,若是错误的配置以下三种 propagation,事务将不会发生回滚。

    TransactionDefinition.PROPAGATION_SUPPORTS:如果当前存在事务,则加入该事务;如果当前没有事务,则以非事务的方式继续运行。 

    TransactionDefinition.PROPAGATION_NOT_SUPPORTED:以非事务方式运行,如果当前存在事务,则把当前事务挂起。 


    TransactionDefinition.PROPAGATION_NEVER:以非事务方式运行,如果当前存在事务,则抛出异常。

    3、@Transactional 注解属性 rollbackFor 设置错误

    rollbackFor 可以指定能够触发事务回滚的异常类型。Spring默认抛出了未检查unchecked异常(继承自 RuntimeException 的异常)或者 Error才回滚事务;其他异常不会触发回滚事务。

    如果在事务中抛出其他类型的异常,但却期望 Spring 能够回滚事务,就需要指定rollbackFor属性。

    7fb69edf3bf8c333b2ff8048fc28f4ef.png

    // 希望自定义的异常可以进行回滚

    若在目标方法中抛出的异常是 rollbackFor 指定的异常的子类,事务同样会回滚。Spring源码如下:

    private int getDepth(Class exceptionClass, int depth) {

    4、同一个类中方法调用,导致@Transactional失效

    开发中避免不了会对同一个类里面的方法调用,比如有一个类Test,它的一个方法A,A再调用本类的方法B(不论方法B是用public还是private修饰),但方法A没有声明注解事务,而B方法有。则外部调用方法A之后,方法B的事务是不会起作用的。这也是经常犯错误的一个地方。

    那为啥会出现这种情况?其实这还是由于使用Spring AOP代理造成的,因为只有当事务方法被当前类以外的代码调用时,才会由Spring生成的代理对象来管理。

    //@Transactional

    5、异常被你的 catch“吃了”导致@Transactional失效

    这种情况是最常见的一种@Transactional注解失效场景,

    @Transactional
        private Integer A() throws Exception {
            int insert = 0;
            try {
                CityInfoDict cityInfoDict = new CityInfoDict();
                cityInfoDict.setCityName("2");
                cityInfoDict.setParentCityId(2);
                /**
                 * A 插入字段为 2的数据
                 */
                insert = cityInfoDictMapper.insert(cityInfoDict);
                /**
                 * B 插入字段为 3的数据
                 */
                b.insertB();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

    如果B方法内部抛了异常,而A方法此时try catch了B方法的异常,那这个事务还能正常回滚吗?

    答案:不能!

    会抛出异常:

     

    因为当ServiceB中抛出了一个异常以后,ServiceB标识当前事务需要rollback。但是ServiceA中由于你手动的捕获这个异常并进行处理,ServiceA认为当前事务应该正常commit。此时就出现了前后不一致,也就是因为这样,抛出了前面的UnexpectedRollbackException异常。

    spring的事务是在调用业务方法之前开始的,业务方法执行完毕之后才执行commit or rollback,事务是否执行取决于是否抛出runtime异常。如果抛出runtime exception 并在你的业务方法中没有catch到的话,事务会回滚。

    在业务方法中一般不需要catch异常,如果非要catch一定要抛出throw new RuntimeException(),或者注解中指定抛异常类型@Transactional(rollbackFor=Exception.class),否则会导致事务失效,数据commit造成数据不一致,所以有些时候try catch反倒会画蛇添足。

    6、数据库引擎不支持事务

    这种情况出现的概率并不高,事务能否生效数据库引擎是否支持事务是关键。常用的MySQL数据库默认使用支持事务的innodb引擎。一旦数据库引擎切换成不支持事务的myisam,那事务就从根本上失效了。

    总结

    @Transactional 注解的看似简单易用,但如果对它的用法一知半解,还是会踩到很多坑的

    6bc8a29dcb16dca99bddb5d10fa126f0.png

    你点的每个“在看”,我都当成了喜欢

    8845d4f6a953a8bd98aba5d406980050.png

    展开全文
  • 一、在springBoot使用事物时,发现事务并没有正常执行,没有... @Transactional public String addIncome1(@RequestParam("name") String name, @RequestParam("amount") double amount) { ...
  • “阿里巴巴Java规范:方法【edit】需要在Transactional注解指定rollbackFor或者在方法中显示的rollback。1.异常的分类先来看看异常的分类error是一定会回滚的这里Exception是异常,他又分为运行时异常...
  • springboot中使用@Transactional注解事物不生效的原因

    万次阅读 多人点赞 2019-04-24 11:19:14
    一:在springboot中使用...另一种是声明式事物,分为两种情况01:一种是通过传统xml方式配置,02:使用@Transaction注解方式配置,这是主要讲解的是通过注解方式配置。因为在springboot项目中,会自动配置DataSour...
  • 1.spring-mvc.xml中是否扫描该路径&...2.注解功能是否启动&lt;tx:annotation-driven transaction-manager="txManager" /&gt;3.配置声明式事务管理&lt;bean id="txM...
  • 最近这几天玩分布式事务的,使用 atomikos ,配置好 atomikos 后再Service层添加事务注解,可是一直有个问题,注解不生效。刚开始以为表支持事务,可看了一下表类型是InnoDB ,是支持事务的。 后来我尝试通过...
  • 最近换了一份工作,公司用的SSM,在开发过程中发现了使用事务注解@Transactional无效,问了其他同事,貌似其他项目也是同样的问题…只好自己百度解决 网上有几种失效的原因,这里大致说一下 1. 配置文件未开启事务...
  • @Transactional注解不起作用解决办法及原理分析

    万次阅读 多人点赞 2018-12-09 00:21:50
    Transactional注解标注方法修饰符为非public时,@Transactional注解将会起作用。例如以下代码。 定义一个错误的@Transactional标注实现,修饰一个默认访问符的方法 /** * @author zhoujy * @date 2018年12月06日...
  • 引言@Transactional注解相信大家并陌生,平时开发中很常用的一个注解,它能保证方法内多个数据库操作要么同时成功、要么同时失败。使用@Transactional注解时需要注意许多的细节,不然你会发现@Transactional总是...
  • 近期项目中遇到很多需要事务处理的逻辑,所以对@Transactional注解的作用条件测试了一番。 @Transactional注解是spring定义的一个注解,可以被子类继承,可以声明在类型、方法上,声明在类型时,可以看作给该类型下...
  • @Transactional能标记私有方法不生效 transactional标签用于将对应包装的bean设置成一个新的代理bean对象供外部使用,就是说外部调用这个proxy bean的公共方法时先会调用开启事务等的切面工作,若设置成私有方法只能...
  • Spring @Transactional注解不生效在spring mvc + mysql的项目中,使用Transactional的时候回滚。在方法上加的是@Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class) 首先先检查了...
  • 一:在springboot中使用...另一种是声明式事物,分为两种情况01:一种是通过传统xml方式配置,02:使用@Transaction注解方式配置,这是主要讲解的是通过注解方式配置。因为在springboot项目中,会自动配置DataSourc...
  • @Transactional注解的失效场景

    千次阅读 2020-04-16 10:17:01
    wfr=spider&for=pc学习留存转载。有问题请联系本人删除 ------------------------------------------------- 一、事务 ...事务管理在系统开发中是可缺少的一部分,Spring提供了很好事务管理机制...
  • @Transactional注解不生效的原因总结(整理网上和自己遇到的解决方案)
  • 点击上方Java后端,选择设为星标优质文章,及时送达引言昨天公众号粉丝咨询了一个问题,说自己之前面试被问@Transactional注解哪些场景下会失效,一时语塞致使面试失败。所以今天简单的和大家分享一下@Transactional...
  • 今天做系统开发的时候,遇到了一个BUG:@Transactional注解在同类方法调用中不生效 代码如下: /** * @description: 快递100接口服务类 * @date 2021/11/23 */ @Service public class SysExpressServiceImpl ...
  • 新手疑问之为什么我已经加上了@Transactional注解,还是失效呢??? 这个很好回答,要么没有生成代理类调用,要么没有开启事务。可以参考细说@Transactional用法及原理 老鸟致命疑问之为什么我已经加上了@...
  • 方法添加了@Transactional注解,为什么事务不生效 二、步骤 测试用表结构 CREATE TABLE `test_aop` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(100) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE...
  • 作用于接口:推荐这种使用方法,因为一旦标注在Interface上并且配置了Spring AOP 使用CGLib动态代理,将会导致@Transactional注解失效 @Transactional @RestController @RequestMapping public class ...
  • @Transactional注解使用

    2019-10-21 16:25:23
    @Transactional注解 可以作用于接口、接口方法、类以及类方法上。当作用于类上时,该类的所有 public 方法将都具有该类型的事务属性,同时,我们也可以在方法级别使用该标注来覆盖类级别的定义。 虽然@...
  • 1、在同一个类中,没有@Transactional注解的方法去调用有@Transactional注解 2、@Transactional注解修饰的方法不是public的 3、抛出的异常为checked类型 但今天比较倒霉了,@Transactional失效,都不是以上3个...
  • 常见事务失效原因: 1.内部调用(常见于同一个...而我出现的场景并在上述的原因列表中,且伴随着@Async注解也失效了,其实是由于Spring 的Aop失效导致的,并可观测出,在controller层拿到的springboot自动注入的serv
  • 声明rollbackFor,只回滚RuntimeException或者Error,如果此时抛出Exception异常是不会回滚的 @Override @Transactional //声明rollbackFor,只回滚RuntimeException或者Error,如果此时抛出Exception异常是不会...
  • SpringBoot@Transactional注解失效

    千次阅读 2019-05-01 17:00:02
    我们用@Transactional注解标注方法开启事务时,测试的时候事务并没有生效。 这是service层的代码,开启事务,并且插入两条数据 @Service public class GirlService { @Autowired private GirlRepository ...
  • 情况2:注解到protected,private 方法上,事务不生效,它也不会报错,不过事务设置不会起作用。 情况3: 在业务层捕捉异常后未向上抛出,事务不生效。 原因:在业务层手工捕捉并处理了异常(try..catch)等于把...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 9,002
精华内容 3,600
关键字:

@transactional注解不生效