「@Transactional」はサービスレイヤーまたはDAOのどこに配置する必要がありますか


81

まず、以前に質問と回答をしたことがあるのに、検索結果を取得できなかった可能性があります。一般的に(またはこれまでのところ常に:))サービスレイヤーでトランザクションアノテーションを定義します典型的な春の休止状態のクラッドは通常です

Controller-> Manager-> Dao-> Orm。

クライアントサイトに基づいてドメインモデルを選択する必要がある状況になりました。クライアントAが私のドメインモデルを使用しているとしましょう。すべて問題ありませんが、他のクライアントサイトがWebサービスを提供し、ドメインモデルを使用していません。

どのレイヤーを置き換える必要がありますか。Webサービスからデータを取得して送り返すのはDAOである必要があると思います。つまり、2つの別々に記述されたDAOレイヤーであり、シナリオに基づいてプラグインされます。

@Transactionalサービスレイヤーに配置したときに、密結合を行っていることに気付きました(そのようなことがある場合、または疎結合がないと言う場合)。非常に多くの脳が間違っているはずがありませんか、それとも彼らですか(私はそれを疑っています)。

したがって、質問は「@TransactionalサービスレイヤーまたはDAOをどこに配置する必要があるか」です。そして、それは私が置き換える必要がある下向きのサービス層ですか。


6
この質問は、実際にはSpring @Transactional Annotation BestPracticeの複製です。
Pascal Thivent 2010年

回答:


81

理想的には、サービスレイヤー(マネージャー)はビジネスロジックを表すため、注釈を付ける必要があります@Transactional

サービス層は、DB操作を実行するために異なるDAOを呼び出す場合があります。サービスメソッドに3つのDAO操作がある状況を想定します。最初のDAO操作が失敗した場合でも、他の2つは渡され、一貫性のないDB状態になってしまう可能性があります。サービスレイヤーに注釈を付けると、このような状況からあなたを救うことができます。


お返事をありがとうございます。返信した年を教えてください。信じられないかもしれませんが、タイムマシンの存在を証明したばかりかもしれません。2015
。– Shahzeb

あなたが尋ねるまで私はその年に気づきませんでした:)
Badal 2015

60

あなたはあなたのサービスがトランザクションであることを望みます。DAOがトランザクションであり、各サービスで異なるDAOを呼び出す場合、複数のトランザクションが発生しますが、これは必要なことではありません。サービス呼び出しをトランザクションにします。これらのメソッド内のすべてのDAO呼び出しは、メソッドのトランザクションに参加します。


6
@Transaction注釈に伝播方法を指定できなかったため、ここに
Fotis Paraskevopoulos 2012

1
彼が持っている場合にのみ動作します@FotisParaskevopoulos@Transactionalの両方のサービスDAO。そうすれば、余分な注釈は害を及ぼすことはありませんが、どちらも役に立ちません。
ウィリアムF.ジェムソン2014

6

複数のDAO実装を持つことができるので、@ Transactionalをサービスレイヤーメソッドに配置することをお勧めします。これを使用することで、サービスをトランザクション型にすることができます。 参照

ベストプラクティスは、一般的なBasicServiceを使用して一般的なサービスを提供することです。

サービスは@Transactionalを配置するのに最適な場所であり、サービスレイヤーは、論理的にトランザクションで行われるユーザーインタラクションの詳細レベルのユースケース動作を保持する必要があります。このようにして、Webアプリケーションコードとビジネスロジックを分離し続けることができます。

重要なビジネスロジックを持たないCRUDアプリケーションはたくさんあります。それらには、コントローラーとデータアクセスオブジェクトの間でデータを渡すだけのサービスレイヤーがあるため、役に立ちません。このような場合、Daoにトランザクションアノテーションを付けることができます。

したがって、実際には、どちらの場所にも配置できます。それはあなた次第です。

サービスで複数の呼び出しを行うには、@ Transactionalをサービスで使用する必要があります。@Transactionalをサービスに入れると、サービスへのさまざまな呼び出しがさまざまなトランザクションで実行されます。


0

アプリケーションが多くのモジュールにまたがって階層化されており、操作の大部分が@CRUDベースである場合、アプリケーションタイプに基づいて個人的に選択します。サービスレベルで@transactionalアノテーションを使用すると、より意味があります。スケジューラ、ジョブサーバー、@ etlなどのエンジンタイプのアプリケーションセッションとユーザーコンセプトが存在しないレポートアプリでは、コンテキストレベルでの伝播トランザクションが最適です...トランザクションのアンチパターンが発生するすべての場所に@transactionalを配置して、クラスター化されたトランザクションを作成することはできません...とにかく実用的なトランザクションの場合コントロールJTA2が最適な答えです...これも天候によって異なりますが、特定の状況で使用できます...


0

別のモデルで同じデータを提供する必要があるクライアントBのドメインモデルを変更する場合は、サービスレイヤーで@Transactionalを使用する必要があります。別のサービスを提供することで、DAOレイヤーに影響を与えることなくドメインモデルを変更できます。インターフェイスを作成し、異なるモデルで同じサービスを使用してインターフェイスを実装することにより、クライアントに基づいてモデルにデータを入力します。この決定は、ビジネス要件とプロジェクトの範囲に基づいています。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.