1

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

他们使用Crud Repository在我的数据库上执行删除操作。我想知道在什么阶段做这些删除得到执行,我需要所有@Transactional注释?

例如,2删除methods被后来被称为在façade method,外墙方法,然后调用在runner

1.方法1:

@Transactional 
public void deleteFromSchemaOne(){ 

} 

1.方法2:

@Transactional 
public void deleteFromSchemaTwo(){ 

} 

2.调用这2种方法在外观方法:

@Transacational 
public void deleteFromAllSchemas(){ 

deleteFromSchemaOne(); 
deleteFromSchemaTwo(); 

} 

3.调用外墙方法亚军

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

     service.deleteFromAllSchemas(); 


} 

我想知道的是:

我删除的阶段实际上是执行?该方法是否在Runner内完成?

编辑:

外墙方法与循环:

public void deleteFromAllSchemas() { 

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

    deleteFromSchemaOne(); 
    deleteFromSchemaTwo(); 

    } 

}

回答

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); 
} 
+0

基本上线的东西我想要做的就是确保在deleteFromAllSchemas()方法是在架构一个和两个务必transactional-即一切被删除或什么也没有,我该怎么做?谢谢你的帮助。 – java123999

+1

这是用你的'deleteFromAllSchemas()'中的'@ Transactional'完成的。如果发生错误,它将回滚在'deleteFromSchemaOne()'和'deleteFromSchemaTwo()'中完成的所有更改。你也应该真正阅读交易。他们不是你希望得到正确的或“在工作中学习”的东西。 – Kayaman

+1

这是正确的。我想补充一点,一般来说,交易应尽可能短。因此,除非这些数据库删除彼此依赖(假设一个失败,您将希望回滚整个事务),那么您应该只注释两个删除方法。这可以确保每次删除都将在单独的事务中运行。如果他们确实相互依赖。使用'@Transactional(propagation = Propagation.MANDATORY)'注释调用它们的方法并选择注释删除方法' –

相关问题