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



该项目使用了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块的执行由于值为Vthrow而突然完成,则可以选择:
    如果V运行时类型可分配给try语句的任何catch子句的参数,则选择第一个(最左边的)此类catch子句。值V被指定给所选catch子句的参数,并执行该catch子句的。然后是一个选择。。。
    • 如果catch块由于R原因突然完成,则执行finally

在您的代码片段中,RuntimeException对应于上面引号中的"valueV"。

异常被抛出并捕获在相应的catch块中,然后通过重新抛出异常"突然完成"——也就是说,代码段中的throw e对应于上面引用的"reasonR"。

然后,根据语言规范的要求,"执行finally块"。

相关内容

  • 没有找到相关文章

最新更新