一、根本原因
Spring事务的原理是AOP,进行了切面增强,那么失效的根本原因是这个AOP不起作用了。
二、常见失效情况
1、发生自调用,类里面使用this调用本类的方法(this通常省略),此时这个this对象不是代理类,而是UserService对象本身!
解决方法很简单,让那个this变成UserService的代理类即可!
2、方法不是public的。@Transaction只能用于public的方法上,否则事务会失效。如果要用在非public方法,可以开启AspectJ代理模式。
3、数据库不支持事务。比如开启的数据库引擎本身不支持事务,如:myisam。
4、没有被spring管理。没有被spring管理,自然也就不能用spring的事务管理机制。
5、异常被吃掉,事务就不会回滚。(或者抛出的异常没有被定义,默认为RuntimeException)