一个应用程序中有多个 Spring @Transactional 注释?

Multiple Spring @Transactional annotations in one application?

在我的应用程序中,我对不同的方法有几个 @Transactional 注释。

他们使用 Crud Repository 对我的数据库进行删除。我想知道在 什么阶段 执行这些删除,我是否需要所有 @Transactional 注释?

例如2 delete methods 后面在a façade method中调用,然后在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);
}