【问题标题】:Spring Boot transaction propagation with private Methods使用私有方法的 Spring Boot 事务传播
【发布时间】:2021-10-31 15:03:42
【问题描述】:

据我了解,私有方法不能在 Spring Boot 中代理。因此@Transactional 不能放在私有方法上。这让我想知道,如果两者之间有一个或多个私有方法,事务是否可以传播,例如以下代码块是否等效:

class SomeClass{

@Autowired Dao dao;
 
@Transactional(propagation = Propagation.REQUIRED)
public bigMethod(int someArgument){
  Data data1 = process(someArgument);
  Data data2 = process(someArgument+1);
  this.dao.save(data1);
  this.dao.save(data2);
}

}

以上是否等同于:

class SomeClass{

    @Autowired Dao dao;

    @Transactional(propagation = Propagation.REQUIRED)
    public bigMethod(int someArgument){
      Data data1 = process(someArgument);
      Data data2 = process(someArgument+1);
      doSave(data1);
      doSave(data2);
    }
    
    private void doSave(Data data){
     this.dao.save(data);
    }

请注意,第二个代码在两者之间添加了一个私有方法。 而在一个单独的类中的 dao.save() 方法如下:

public class DAO{
 @Autowired Repository repo;
 @Transactional(propagation = Propagation.REQUIRED)   
  public void save(Data data){
  repo.save(data);
  }
 }

【问题讨论】:

  • 管理你的 trx 手册,参考:stackoverflow.com/questions/26606608/…
  • 没关系,因为两个版本都不能正常工作。保存函数必须在另一个 Bean 中,无论如何它不能在同一个 bean 中,因为 Spring 不能在同一个类中的 java 到 java 函数调用之间插入自己。
  • @GonenI,dao.save() 在一个单独的类中。我将编辑我的问题以反映这一点。
  • 在这种情况下,您将必须引用该其他类的 bean,而中间的私有函数将没有任何区别。
  • @GonenI,是的,我只保留了部分相关的代码。无论如何,谢谢。

标签: java spring spring-boot spring-transactions


【解决方案1】:

为了让 Spring 为您提供事务传播等服务,它需要能够在调用之间拦截或“插入自身”。

当你调用 dao.bigMethod 时,dao 对象并不是真正的 Dao 类的实例,而实际上是 Dao 类的 Spring AOP 代理,它也有一个 bigMethod 函数。当你在 AOP 代理上调用 bigMethod 时,Spring 添加它的服务,例如事务,然后调用你的 bigMethod 类。

一旦你在你的 bigMethod 函数中,你只是在一个普通的 Java 函数中,Spring 看不到你进行的任何函数调用。因此,如果在 bigMethod 内部调用了另一个 Java 函数,例如 save,Spring 将看不到它,也无法再添加任何事务服务。

要从 Spring 获取更多服务,您必须将 save 移至另一个 bean,并获取该 bean 的句柄,该句柄将再次指向包含 save 的类的 AOP 代理。

一旦你有了那个 AOP 代理,当你调用它时,Spring 会再次为你提供事务服务,即使调用点在私有函数内部。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-22
    • 2014-06-22
    • 2016-11-16
    • 1970-01-01
    • 2015-12-19
    • 2011-09-20
    相关资源
    最近更新 更多