Spring事物不生效的几种情况
事务不生效的几种情况
- 方法的访问级别不是public,这点是由spring aop决定的。不能加statis,final。
- 异常被catch住了。
- 默认情况下unchecked异常会回滚,如果是checked异常则不回滚。这个时候需要在注解上面指定异常类型 @Transactional(rollbackFor=Exception.class)
java里面将派生于Error或者RuntimeException(比如空指针,1/0)的异常称为unchecked异常,其他继承自java.lang.Exception得异常统称为Checked Exception,如IOException、TimeoutException等
- 据库引擎要支持事务,如果是MySQL,注意表要使用支持事务的引擎,比如innodb,如果是myisam,事务是不起作用的。
- 是否开启了事物注解
<tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true"/>
- spring是否扫描到你这个包,如下是扫描到org.test下面的包
<context:component-scan base-package="org.test" ></context:component-scan>
- 在同一类中调用。比如a类的b方法调用了a的c方法
事物异常
org.springframework.transaction.NoTransactionException: No transaction aspect-managed TransactionStatus in scope
sping的事务是通过注解配置上去的,而下面的那个方法并没有接口,在实现类里面只是一个简单的方法而已,对于事务的注解来说没有任何作用,所以在这个方法里面调用回滚的方法自然就报错了。
解决方法,因为我这是service里面调用得一个内部方法,如果我在service方法中加入事务,那么报错所有数据都会回滚,这并不是我想要得,所以我将这个方法放到另外一个serivce里面去了
手动执行回滚
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();