2011-08-16 6 views
34

私は現在、Springのもとで再利用しようとしているいくつかのレガシーコードを持っています。このコードは他のコードに深くネストされているので、再設計するのは現実的ではなく、多くの状況で呼び出されます。私がしたいのは、Springトランザクションが開始されていればSpringトランザクションを使用することです。それ以外の場合は、引き続き既存の(レガシー)db接続メカニズムを使用してください。私たちの最初の考えは、レガシークラスをBeanにして、注入されたTransactionPlatformManagerを使用することでしたが、それは私たちの状況に密接に関連したメソッドを持っていないようです。いくつかの研究では、SpringにはTransactionSynchronizationManagerというクラスがあり、静的メソッドisActualTransactionActive()があることがわかりました。私のテストでは、この方法は、春のトランザクションがアクティブであるかどうかを検出する信頼性の高い方法であることを示している:Spring DBトランザクションがTransactionSynchronizationManager.isActualTransactionActive()を使用するよりもアクティブであるかどうかを検出する良い方法はありますか?

  • @Transactional注釈なし春のサービスを介して呼び出されると@Transactionalで春のサービスを介して呼び出されると、それは
  • 偽を返し、それを返します私のレガシー方法では
  • 真は、既存の方法と呼ばれる、それは私の質問

を返します:トランザクションがアクティブであるかどうかを検出する良い方法はありますか?

答えて

37

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

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

+0

ありがとうございました!それは最高です。 – fool4jesus

関連する問題