@Transactional失效的几种场景

1.一个有@Transactional的方法被没有@Transactional方法调用时,会致使Transactional做用失效。也是最容易出现的状况。this

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

2.对非public方法进行事务注解。@Transactional 将会失效。code

  缘由:是应为在Spring AOP代理时,事务拦截器在目标方法先后进行拦截,DynamicAdvisedInterceptor的intercept 方法会获取Transactional注解的事务配置信息,对象

由于在Spring AOP 代理时,如上图所示 TransactionInterceptor (事务拦截器)在目标方法执行先后进行拦截, DynamicAdvisedInterceptor(CglibAopProxy 的内部类)的 intercept 方法或 JdkDynamicAopProxy 的 invoke 方法会间接调用 AbstractFallbackTransactionAttributeSourcecomputeTransactionAttribute 方法会间接调用 AbstractFallbackTransactionAttributeSourcecomputeTransactionAttribute 方法,这个方法会获取Transactional 注解的事务配置信息。他会首先校验事务方法的修饰符是否是public,不是 public则不会获取@Transactional 的属性配置信息。
3.Transactional 事务配置属性中的propagation 属性配置的问题。
  当propagation属性配置为:
TransactionDefinition.PROPAGATION_SUPPORTS:若是当前存在事务,则加入该事务;若是当前没有事务,则以非事务的方式继续运行。        TransactionDefinition.PROPAGATION_NOT_SUPPORTED:以非事务方式运行,若是当前存在事务,则把当前事务挂起。     TransactionDefinition.PROPAGATION_NEVER:以非事务方式运行,若是当前存在事务,则抛出异常
 

4.还存在一种状况:事务

  在一个类中A方法被事务注释,B方法也被事务注释。it

@ Transactionalio

 public void A(){sed

  try{配置

  this.B();方法

  }catch(Exception e){

    logger.error();

  }

 

}

但在执行B方法是报错,可是异常被A catch 住,此时事务也会失效。

相关文章
相关标签/搜索