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

Java 在一个应用程序中有多个Spring@Transactional注释?,java,spring,database-connection,spring-annotations,transactional,Java,Spring,Database Connection,Spring Annotations,Transactional,在我的应用程序中,我在不同的方法上有几个@Transactional注释 他们使用Crud存储库对我的数据库执行删除。我想知道这些删除是在什么阶段执行的,我需要所有的@Transactional注释吗 例如,2个delete方法,随后在立面方法中调用,然后在运行程序中调用立面方法: 1。方法1: @Transactional public void deleteFromSchemaOne(){ } 1。方法2: @Transactional public void deleteFromSch

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

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

例如,2个delete
方法
,随后在
立面方法
中调用,然后在
运行程序
中调用立面方法:

1。方法1:

@Transactional
public void deleteFromSchemaOne(){

}
1。方法2:

@Transactional
public void deleteFromSchemaTwo(){

}
@Transacational
public void deleteFromAllSchemas(){

deleteFromSchemaOne();
deleteFromSchemaTwo();

}
public void deleteFromAllSchemas() {

    for(int i = 0; i < list.size(); i++){

     deleteFromSchemaOne();
     deleteFromSchemaTwo();

    }
2。在façade方法中调用这两个方法:

@Transactional
public void deleteFromSchemaTwo(){

}
@Transacational
public void deleteFromAllSchemas(){

deleteFromSchemaOne();
deleteFromSchemaTwo();

}
public void deleteFromAllSchemas() {

    for(int i = 0; i < list.size(); i++){

     deleteFromSchemaOne();
     deleteFromSchemaTwo();

    }
3。调用runner中的façade方法

@Transactional
    public void run(String... args) throws Exception {

        service.deleteFromAllSchemas();


}
我想知道的是:

我的删除将在哪个阶段执行?是否会在Runner中完成该方法

编辑:

带循环的立面方法:

@Transactional
public void deleteFromSchemaTwo(){

}
@Transacational
public void deleteFromAllSchemas(){

deleteFromSchemaOne();
deleteFromSchemaTwo();

}
public void deleteFromAllSchemas() {

    for(int i = 0; i < list.size(); i++){

     deleteFromSchemaOne();
     deleteFromSchemaTwo();

    }
public void deleteFromAllSchemas(){
对于(int i=0;i

}

当最外面的事务完成时,所以在
运行()之后。
实际上这不是最外层的,这是唯一的交易。内部
@Transactionals
不创建新事务,它们只是加入现有事务

如果需要确保在外部事务完成之前提交某些更改,则需要使用
@Transactional(propagation=propagation.REQUIRES\u 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);
}
public void run(){
对于(int i=0;i
基本上,我想做的是确保deleteFromAllSchemas()方法是事务性的,即必须删除模式1和模式2中的所有内容,或者什么都不删除,我该怎么做?感谢您的帮助。这是通过
deleteFromAllSchemas()
中的
@Transactional
实现的。如果发生错误,它将回滚在
deleteFromSchemaOne()
deleteFromSchemaTwo()中所做的任何更改。你也应该认真阅读交易。它们不是你只希望做对或“在工作中学习”的东西。这是正确的。我想补充一点,一般来说,交易应该尽可能短。因此,除非这些数据库删除相互依赖(假设其中一个数据库删除失败,您可能希望回滚整个事务),否则您应该只注释这两个delete方法。这确保了每次删除都将在单独的事务中运行。如果他们彼此依赖。注释调用它们的方法,并可选地使用
@Transactional(propagation=propagation.MANDATORY)
注释delete方法。谢谢,那么在什么情况下我需要运行程序上的@Transactional注释呢?@java123999太宽泛了,无法讨论。也许永远不会,也许在某些情况下取决于你的设计。