在我的应用程序中,我有几个关于不同方法的 @Transactional
注释。
他们使用 Crud Repository
对我的数据库执行删除操作。我想知道在什么阶段执行这些删除,我是否需要所有的 @Transactional
注释?
例如,2删除methods
之后在façade方法
中调用,然后在runner
中调用façade方法:
<强>1。方法一:
@Transactional
public void deleteFromSchemaOne(){
}
<强>1。方法二:
@Transactional
public void deleteFromSchemaTwo(){
}
<强>2。在外观方法中调用这 2 个方法:
@Transacational
public void deleteFromAllSchemas(){
deleteFromSchemaOne();
deleteFromSchemaTwo();
}
<强>3。在runner中调用façade方法
@Transactional
public void run(String... args) throws Exception {
service.deleteFromAllSchemas();
}
我想知道的是:
我的删除实际上将在哪个阶段执行?是否会在 Runner 中完成方法时?
编辑:
带循环的外观方法:
public void deleteFromAllSchemas() {
for(int i = 0; i < list.size(); i++){
deleteFromSchemaOne();
deleteFromSchemaTwo();
}
最佳答案
当最外层事务完成时,所以在 run()
之后。
实际上它不是最外层的,它是唯一的交易。内部 @Transactionals
不会创建新事务,它们只是加入现有事务。
如果您需要确保甚至在外部事务完成之前提交某些更改,您需要使用 @Transactional(propagation=Propagation.REQUIRES_NEW)
设置事务的传播。这将创建一个新的交易,即使已经存在一个交易也是如此。
在您的示例代码中(至少基于它现在包含的内容),run()
方法可能甚至不应该启动事务。
如果我没理解错的话,你想要的是
public void run() {
for(int i = 0;i < list.size(); i++)
service.deleteFromAllSchemas(i);
}
@Transactional
public void deleteFromAllSchemas(int i) {
deleteFromSchemaOne(i);
deleteFromSchemaTwo(i);
}
关于java - 一个应用程序中有多个 Spring @Transactional 注释?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37296813/