背景

说来话巧,这次项目开发用了Oracle里面的一种事务级临时表,on commit delete rows,意味着这张临时表会在每次事务提交的时候删除数据。

涉及知识点

Spring事务传播机制、AOP

实现方案:

需要对临时表的一系列操作在一个事务中执行,事务传播机制采用默认值PROPAGATION_REQUIRED,这样只要外层有事务,事务内嵌套的事务会加入到当前事务中执行,可以实现在同一事务的需求

问题出现

同类方法调用@Transaction注解的方法,事务失效(AOP原理)
插入方法用得是batchSave
同类方法调用@Transaction注解的方法,事务失效(AOP原理)
同类方法调用@Transaction注解的方法,事务失效(AOP原理)

我是如何发现问题的

同类方法调用@Transaction注解的方法,事务失效(AOP原理)
按理说上面的batchSave方法应该是嵌套的事务,事务传播机制为PROPAGATION_REQUIRED,不应该是Creating new transaction新建一个事务啊,难道外层的事务没生效?突然恍然大悟

知识点分析

基于注解的事务的实现原理是面向切面编程,通过cglib创建代理proxy,当我们访问带 @Transactional方法,实际访问的是代理对象,代理对象已经在带 @Transactional方法前后增加了事务相关的逻辑。而当调用带 @Transactional方法的调用方是同类方法时,就无法访问到代理对象,事务也就没有派上用场。

解决方案

1、将@transactionl的方法的调用方移到其他类中

相关文章:

  • 2021-11-04
  • 2022-12-23
  • 2021-08-11
  • 2021-10-10
  • 2022-12-23
猜你喜欢
  • 2021-11-22
  • 2022-12-23
  • 2021-08-20
  • 2021-11-05
相关资源
相似解决方案