Spring可以在try块中使用RunTimeException在finally块中提交Transaction

时间:2012-11-13 15:09:53

标签: java spring hibernate transactions try-catch-finally

该项目使用了Spring + Hibernate

示例代码:

public void method(){    
   try{  
     dao.saveA(entityA);  
     //condition may be throw RuntimeException;  
     dao.saveB(entityB);  
    }catch(RuntimeException e){  
     throw e;  
    }finally{  
      dao.saveC(entityC)  
    }  
}

最后,只需将entityC保存在测试数据库中 我认为saveA,saveB,saveC在同一个交易中,它们不应该被提交 在这种情况下,我想知道为什么提交entityC Spring如何在finally块中执行此操作?

// // -------------------------
实际上,我的问题是:spring如何确保在finally块中提交的事务。 Spring会在finally块中获得一个新的连接吗?

1 个答案:

答案 0 :(得分:0)

Spring与此无关,您获得的是 JLS 14.20.2 Execution of try-catch-finally 所要求的行为:

  

首先执行try块,执行带有finally块的try语句。然后有一个选择...

     
      
  • 如果try块的执行由于{{1>}值 V 而突然完成,则可以选择:
      如果 V 的运行时类型可分配给throw语句的任何catch子句的参数,那么第一个(最左边)这样的try子句被选中。值 V 将分配给所选catch子句的参数,并执行该catch子句的。然后有一个选择......   
        
    • 如果catch块突然因 R 而突然完成,则执行catch块...
    •   
  •   

在您的代码段中,finally对应于上面引用中的“值 V ”。

异常被抛出并被捕获到相应的catch块中,然后通过重新抛出异常“突然完成” - 也就是说,您的代码段中的RuntimeException对应于“reason R ”在上面引用。

然后,根据语言规范的要求,“throw e块被执行”。