背景
说来话巧,这次项目开发用了Oracle里面的一种事务级临时表,on commit delete rows,意味着这张临时表会在每次事务提交的时候删除数据。
涉及知识点
Spring事务传播机制、AOP
实现方案:
需要对临时表的一系列操作在一个事务中执行,事务传播机制采用默认值PROPAGATION_REQUIRED,这样只要外层有事务,事务内嵌套的事务会加入到当前事务中执行,可以实现在同一事务的需求
问题出现
插入方法用得是batchSave
我是如何发现问题的
按理说上面的batchSave方法应该是嵌套的事务,事务传播机制为PROPAGATION_REQUIRED,不应该是Creating new transaction新建一个事务啊,难道外层的事务没生效?突然恍然大悟
知识点分析
基于注解的事务的实现原理是面向切面编程,通过cglib创建代理proxy,当我们访问带 @Transactional方法,实际访问的是代理对象,代理对象已经在带 @Transactional方法前后增加了事务相关的逻辑。而当调用带 @Transactional方法的调用方是同类方法时,就无法访问到代理对象,事务也就没有派上用场。
解决方案
1、将@transactionl的方法的调用方移到其他类中