事务失效的几种原因:
1.spring的事务注解@Transactional只能放在public修饰的方法上才起作用,如果放在其他非public(private,protected)方法上,虽然不报错,但是事务不起作用
2.如使用mysql且引擎是MyISAM,则事务会不起作用,原因是MyISAM不支持事务,可以改成InnoDB引擎。
3.默认情况下,Spring会对unchecked异常进行事务回滚;如果是checked异常则不回滚。
什么是unchecked异常,什么是checked异常?
java里面将派生于Error或者RuntimeException(比如空指针,1/0)的异常成为unchecked异常,其他继承自java.lang.Exception的异常统称为checked Exception,如IOException、TimeOutException等
通俗点讲就是,写的代码出现了空指针异常,会被回滚,而文件读写,网络出问题,spring就没法回滚了。
写代码的时候,有些IOException我们的编译器能够检测到的,所以说叫checked异常,写代码的时候空指针异常时检测不到的,所以叫unchecked异常。
在业务代码中如果抛出RuntimeException异常,事务回滚;但是抛出Exception,事务不回滚;
4.如果在加有事务的方法内,使用了try...catch..语句块对异常进行了捕获,而catch语句块没有throw new RuntimeExecption异常,事务也不会回滚
5. 在类A里面有方法a 和方法b, 然后方法b上面用 @Transactional加了方法级别的事务,在方法a里面 调用了方法b, 方法b里面的事务不会生效。
原因是在同一个类之中,方法互相调用,切面无效 ,而不仅仅是事务。这里事务之所以无效,是因为spring的事务是通过AOP实现的。