如果我有如下所示的事务方法,那么在事务提交和回滚的情况下何时执行finally块?例如,如果“使用hibernate在数据库中保留某个实体”会抛出一些hibernate异常,这是真的吗?
1)事务回滚 2)最后执行块
或
1)执行finally块 2)事务回滚
public void someTransactionalPersist(...) {
try {
// persist some entity in database with hibernate
} finally {
// do something
}
}
答案 0 :(得分:1)
try{
//This is executed if an exception is not thrown
} catch(Exception e){
//This is executed if an exception is thrown
} finally{
//This is executed regardless of which of the above was executed
}
答案 1 :(得分:0)
在这两种情况下,finally块都将执行finally。
序列将是,如果你的try块抛出异常,那么它将首先rollback
,然后finally
阻止executed
。
答案 2 :(得分:0)
假设someTransactionalPersist方法是事务的起始点,那么如果try块中有任何异常,则首先最终将执行,如果从finally块抛出运行时异常,则spring将作为默认配置进行回滚。
如果您想要针对特定异常进行回滚,那么您必须使用@Transactional
配置rollbackFor
。
如果你想手动将事务标记为回滚而不进一步抛出异常/运行时异常,那么你必须在catch块TransactionAspectSupport.currentTransactionStatus().setRollbackOnly()
中执行此操作
答案 3 :(得分:0)
关于规范http://docs.oracle.com/javase/specs/jls/se7/html/jls-14.html#jls-14.20.2
如果没有Exception,则在try没有错误执行后,将执行finally块。如果try中存在错误并且存在catch-block,则捕获该异常,将执行catch块。然后,将执行finally块。
如果try块中存在错误并且没有catch块,捕获该异常,则将执行finally块,并且您的方法将抛出该未捕获的异常。
因此,finally块将始终执行,并且将始终是最后一个块,正在执行。