3

プロジェクトは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ブロックでこれをどのように行いますか?

// ------------------------- //
実際、私の質問は次のとおりです。finallyブロックでコミットされたトランザクションをどのように春に保証するか。Springはfinallyブロックで新しい接続を取得しますか?

4

1 に答える 1

0

Springはこれとは何の関係もありません。取得するのは、JLS14.20.2で要求される動作です。try-catch-finallyの実行

ブロックを含むtryステートメントは、finally最初にブロックを実行することによって実行されtryます。次に、選択肢があります...

  • Vが原因でブロックの実行がtry突然完了する場合は、選択肢があります。 実行時型のVがステートメントのいずれかの句のパラメーターに割り当て可能である場合、最初の(左端の)そのような句は次のようになります。選択されました。選択した句のパラメータに値Vが割り当てられ、その句のブロックが実行されます。次に、選択肢があります... throw
    catchtrycatchcatchcatch
    • catchブロックが理由Rで突然完了すると、finallyブロックが実行されます。

コードスニペットでは、上記の引用のRuntimeException「値V 」に対応します。

例外がスローされ、それぞれのcatchブロックでキャッチされます。次に、例外を再スローすることで「突然完了」しthrow eます。つまり、スニペットでは、上記の引用の「理由R 」に対応します。

次に、言語仕様で要求されるように、「finallyブロックが実行されます」。

于 2012-11-13T15:37:50.973 に答える