使用默认的事务处理方式

在Java的设计中,认为不继承RuntimeException的异常是”checkException”或”普通异常”,如IOException,这些异常在Java语法中是要求强制处理的。对于这些普通的异常,Spring默认他们都已经处理,所以默认不回滚,可以添加rollbackfor=Exception.class来表示所有的Exception都回滚。

内部调用

不带事务的方法调用该类中带事务的方法,不会回滚。因为Spring的回滚是通过代理模式生成的,如果是一个不带事务的方法调用了一个带事务的方法,直接通过this.xxx()调用,不会生成代理事务,所以事务不起作用。

只有被动态代理直接调用时才会产生事务,IOC容器返回的调用的对象是代理对象不是真实对象。this是真实对象,不是代理对象。

解决方法:

  1. 方法A开启事务,B不用事务或者默认事务,默认回滚RuntimeException
  2. 方法A不开启事务,B开启事务,B改为动态代理调用

    EmployeeService proxy = (EmployeeService) AopContext.currentProxy();