3

如果我有像下面这样的事务方法,那么在事务提交和回滚的情况下何时执行 finally 块?例如,如果“使用休眠将某些实体保存在数据库中”会引发一些休眠异常,这是真的吗?

1) 事务回滚 2) finally 块被执行

或者

1) finally 块被执行 2) 事务回滚

public void someTransactionalPersist(...) {
     try {
     // persist some entity in database with hibernate
     } finally {
        // do something 
     }
}
4

4 回答 4

1

在这两种情况下 finally 块都会最终执行。顺序将是,如果您的 try 块抛出异常,那么它将rollback首先然后finally块将executed

于 2012-11-07T09:58:23.960 回答
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
}
于 2012-11-07T10:21:41.023 回答
0

假设 someTransactionalPersist 方法是事务的起点,那么如果 try 块中有任何异常,则首先将执行 finally,如果 finally 块抛出运行时异常,则 spring 将作为默认配置进行回滚。

如果要回滚特定异常,则必须@Transactional使用rollbackFor.

如果您想手动将事务标记为回滚而不进一步抛出异常/运行时异常,那么您必须在 catch 块中执行此操作TransactionAspectSupport.currentTransactionStatus().setRollbackOnly()

于 2012-11-07T09:59:01.627 回答
0

关于规范http://docs.oracle.com/javase/specs/jls/se7/html/jls-14.html#jls-14.20.2

如果没有异常,则在 try 执行无误后,将执行 finally 块。如果 try 中有错误并且有一个 catch 块,捕获该异常,则执行 catch 块。之后,finally 块将被执行。

如果 try 块中有错误并且没有 catch 块,则捕获该异常,finally 块将被执行,并且您的方法将抛出该未捕获的异常。

因此,finally 块将始终被执行,并且始终是最后一个正在执行的块。

于 2012-11-07T10:03:01.437 回答