使用默认的事务处理方式
在Java的设计中,认为不继承RuntimeException的异常是”checkException”或”普通异常”,如IOException,这些异常在Java语法中是要求强制处理的。对于这些普通的异常,Spring默认他们都已经处理,所以默认不回滚,可以添加rollbackfor=Exception.class来表示所有的Exception都回滚。
内部调用
不带事务的方法调用该类中带事务的方法,不会回滚。因为Spring的回滚是通过代理模式生成的,如果是一个不带事务的方法调用了一个带事务的方法,直接通过this.xxx()调用,不会生成代理事务,所以事务不起作用。
只有被动态代理直接调用时才会产生事务,IOC容器返回的调用的对象是代理对象不是真实对象。this是真实对象,不是代理对象。
解决方法:
- 方法A开启事务,B不用事务或者默认事务,默认回滚RuntimeException
- 方法A不开启事务,B开启事务,B改为动态代理调用
EmployeeService proxy = (EmployeeService) AopContext.currentProxy();