该项目使用了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块中获得新的连接吗?
Spring与此无关,您获得的是JLS 14.20.2所需的行为。最终执行try-catch:
具有
finally
块的try
语句是通过首先执行try
块来执行的。然后是一个选择。。。
- 如果
try
块的执行由于值为V的throw
而突然完成,则可以选择:
如果V运行时类型可分配给try
语句的任何catch
子句的参数,则选择第一个(最左边的)此类catch
子句。值V被指定给所选catch
子句的参数,并执行该catch
子句的块。然后是一个选择。。。
- 如果
catch
块由于R原因突然完成,则执行finally
块
在您的代码片段中,RuntimeException
对应于上面引号中的"valueV"。
异常被抛出并捕获在相应的catch块中,然后通过重新抛出异常"突然完成"——也就是说,代码段中的throw e
对应于上面引用的"reasonR"。
然后,根据语言规范的要求,"执行finally
块"。