1、首先在上一篇如何利用spring注解和try catch处理事务的文章中示例的基础上做修改,我们在外层类中再加一个更新数据库的语句,如下图所示:
2、现在如果我们想实现,内部类更新出现异常,外部类也回滚。那该如何处理呢?很简单,就是把内部类和外部类都包含到同一个事务下即可,即在外部类或者方法上加上注解@Transactional即可。如下:
3、如果,现在想实现如下的逻辑:
4、Ok,根据上图我们可以看到,AA类做为BB类的父类(嵌套类,没有妤伊佛集继承关系,调用父子关系)如果要实现BB类出现异常AA类中的更新数据库回滚,我们该如何处理呢?很简单,我们就需要把蚱澄堆别BB类中更新数据库的操作作为一个单独的事务处理(起一个新的事务),那么,目前有两种处理方式,首先我们在外层类加上事务控制,内层类也同样加上事务控制(起一个新的事务)如下:外层类:
5、内层类:
6、到目前为止,我们可以看到,我在子类中加了个事务控制,propagetion属性指定了新的事务,但是我们可以发现,执行效果并不是我们想要的,而且,如果外层类加了事务控制后,每次在调用内部类方刮茕栓双法时都会挂起当前事务(锁住更新的库表),只有等内部类(新事物)执行完成后,才再解锁外部执行数据库,如果内部类和外部类执行的都是同一个表还会发生死锁。如果使得内部类和外部类不执行同一个表操作,也不会得到我们想要的结果,你会发现,无论我们怎样为内部类配置事务都不会起到作用,这是为什么呢??原因很简单,这是因为外层类在调用内部类时,内部类并不是spring代理对象,也就是说内部类并不是spring的bean对象,而是调用时new了一个普通的javabean。所以我们必须把子类作为spring的bean来使用它,并且调用的时候不能new 要用获取spring bean 的方式获取。做如下操作:外部类:
7、内部类:
8、经过上述配置就可以得到你想要的结果