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

时间:2016-05-18 10:24:49

标签: java spring database-connection spring-annotations transactional

在我的应用程序中,我对不同的方法有几个@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();

    }

}

1 个答案:

答案 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);
}