【发布时间】: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