3

以下のようなトランザクションメソッドがある場合、トランザクションのコミットとロールバックの場合、finallyブロックはいつ実行されますか?たとえば、「データベース内のエンティティを休止状態で永続化する」と、休止状態の例外がスローされた場合、これは本当ですか?

1)トランザクションのロールバック2)最後にブロックが実行されます

また

1)最後にブロックが実行されます2)トランザクションのロールバック

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

4 に答える 4

1

どちらの場合も、finally ブロックは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

仕様についてhttp://docs.oracle.com/javase/specs/jls/se7/html/jls-14.html#jls-14.20.2

Exception がない場合、try がエラーなしで実行された後、finally ブロックが実行されます。try にエラーがあり、その例外をキャッチする catch ブロックがある場合、catch ブロックが実行されます。その後、finally ブロックが実行されます。

try ブロックにエラーがあり、その例外をキャッチする catch ブロックがない場合、finally ブロックが実行され、メソッドはキャッチされていない例外をスローします。

したがって、finally ブロックは常に実行され、常に実行される最後のブロックになります。

于 2012-11-07T10:03:01.437 に答える
0

someTransactionalPersist メソッドがトランザクションの開始点であると仮定すると、try ブロックに例外がある場合、最初に finally が実行され、finally ブロックからスローされたランタイム例外がある場合、Spring はデフォルト構成としてロールバックを行います。

特定の例外のロールバックが必要な場合は、で構成する必要があり@TransactionalますrollbackFor

例外/ランタイム例外をさらにスローせずに手動でトランザクションをロールバックとしてマークする場合は、catch ブロックでこれを行う必要がありますTransactionAspectSupport.currentTransactionStatus().setRollbackOnly()

于 2012-11-07T09:59:01.627 に答える