该项目使用了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块中获得一个新的连接吗?
答案 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
块被执行”。