Spring事物不生效的几种情况

Spring事物不生效的几种情况

事务不生效的几种情况

  1. 方法的访问级别不是public,这点是由spring aop决定的。不能加statis,final。
  2. 异常被catch住了。
  3. 默认情况下unchecked异常会回滚,如果是checked异常则不回滚。这个时候需要在注解上面指定异常类型 @Transactional(rollbackFor=Exception.class)

java里面将派生于Error或者RuntimeException(比如空指针,1/0)的异常称为unchecked异常,其他继承自java.lang.Exception得异常统称为Checked Exception,如IOException、TimeoutException等

  1. 据库引擎要支持事务,如果是MySQL,注意表要使用支持事务的引擎,比如innodb,如果是myisam,事务是不起作用的。
  2. 是否开启了事物注解
    <tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true"/>
  1. spring是否扫描到你这个包,如下是扫描到org.test下面的包
<context:component-scan base-package="org.test" ></context:component-scan>
  1. 在同一类中调用。比如a类的b方法调用了a的c方法

事物异常

org.springframework.transaction.NoTransactionException: No transaction aspect-managed TransactionStatus in scope

sping的事务是通过注解配置上去的,而下面的那个方法并没有接口,在实现类里面只是一个简单的方法而已,对于事务的注解来说没有任何作用,所以在这个方法里面调用回滚的方法自然就报错了。

解决方法,因为我这是service里面调用得一个内部方法,如果我在service方法中加入事务,那么报错所有数据都会回滚,这并不是我想要得,所以我将这个方法放到另外一个serivce里面去了

手动执行回滚

TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();