web-dev-qa-db-ja.com

Transaction DBトランザクションがアクティブであるかどうかを検出するには、TransactionSynchronizationManager.isActualTransactionActive()を使用するよりも優れた方法がありますか?

Springで再利用しようとしているレガシーコードがあります。このコードは他のコードに深くネストされているため、再設計するのは実用的ではなく、多くの状況で呼び出されますが、その一部はSpringを介して行われます。私がやりたいのは、Springトランザクションが開始されている場合はそれを使用することです。それ以外の場合は、既存の(レガシー)db接続メカニズムを引き続き使用します。私たちの最初の考えは、レガシークラスをBeanにして、インジェクションされたTransactionPlatformManagerを使用することでしたが、これには、状況に密接な関係があるメソッドはないようです。一部の調査によると、SpringにはTransactionSynchronizationManagerというクラスがあり、静的メソッドisActualTransactionActive()があります。私のテストでは、この方法がSpringトランザクションがアクティブかどうかを検出する信頼できる方法であることを示しています。

  • @TransactionalアノテーションなしでSpringサービス経由で呼び出されると、falseを返します
  • @TransactionalでSpringサービスを介して呼び出されると、trueを返します
  • 既存の方法と呼ばれる私のレガシーメソッドでは、falseを返します

私の質問:トランザクションがアクティブかどうかを検出するより良い方法はありますか?

41
fool4jesus

TransactionSynchronizationManager.isActualTransactionActive() より良い方法はありません。これは、トランザクションを処理するためにSpringで使用されるユーティリティメソッドです。コード内で使用することはお勧めできませんが、特定のケースでは使用する必要があるため、公開されています。

もう1つの方法は、エンティティマネージャー/セッション/接続を使用して、既存のトランザクションがあるかどうかを確認することですが、同期マネージャーを使用することをお勧めします。

49
Bozho