spring事务的原理是AOP,进行了切面增强,那么失效的根本原因是这个AOP不起作用!常见情况如下几种
1、发生是调用,类里面使用this调用本类发方法(this通常省略),此时这个this对象不是代理类,而是UserService对象本身!
解决办法很简单,让那个this变成UserService的代理类即可!
2方法不是public修饰的
@Transactional
只能用于public 的方法否者事务不会生效,如果要用在非public 方法上,可以开启
AspectJ 代理模式
3、数据库不支持事务
InnoDB支持事务,MyISAM不支持,这一点是非常之重要。事务是一种高级的处理方式,如在一些列增删改中只要哪个出错还可以回滚还原,而MyISAM就不可以了。
链接: 了解数据库存储引擎.
4、没有被spring管理
链接: 了解spring事务管理.
5、异常被catch掉,事务不会回滚(或者抛出的异常没有被定义,默认为RuntimeExcelption)