在我的应用程序中,我对不同的方法有几个@Transactional
注释。
他们使用Crud Repository
对我的数据库执行删除操作。我想知道在哪个阶段执行这些删除操作,我是否需要所有@Transactional
注释?
例如,2删除稍后在methods
中调用的façade method
,然后在runner
中调用façade方法:
1。方法1:
@Transactional
public void deleteFromSchemaOne(){
}
1。方法2:
@Transactional
public void deleteFromSchemaTwo(){
}
2。在façade方法中调用这两个方法:
@Transacational
public void deleteFromAllSchemas(){
deleteFromSchemaOne();
deleteFromSchemaTwo();
}
第3。在跑步者中调用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();
}
}
答案 0 :(得分:3)
最外层交易完成后,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);
}