1

永続化ソリューションとして Hibernate を使用して、Spring MVC で新しいアプリケーションを構築しています。データ層にアプローチするには、次の 2 つのソリューションがあります。

1) 場合によっては、コントローラーが DAO レイヤーを直接呼び出します。これは、ビジネス チェックを実行する必要がないためです。そのため、そのような場合にはサービス層をバイパスしています。このためにサービス層を実装すると、メソッドを DAO 層に委譲するだけになります。

したがって、次のことを行っています: Controller -> DAO

2) その他のケースでは、いくつかのビジネス チェックが必要です。このために、従来の方法を使用します:
Controller -> Service -> DAO

Spring では、トランザクションを区切る必要があるため、すべての DAO メソッドに @Transaction アノテーションを付けます。これは、Controller -> DAO の方法で問題なく動作します。ただし、Controller -> Service -> DAO の方法を実行している場合は、サービス メソッドに @Transaction アノテーションを付ける必要もあります。

これは、場合によってはトランザクションがネストされていることを意味します。これは良いアプローチですか?すべての DAO メソッドで新しいトランザクション (REQUIRES_NEW) を作成する必要がありますか、それとも既存のトランザクション (REQUIRED) が存在する場合はそれを使用する必要がありますか?

誰かがこれについて私に教えてもらえますか?

4

1 に答える 1

4

デフォルトの伝播戦略 ( REQUIRED) は、ほとんどのシナリオで妥当な選択であるため、非常に特別な要件がない限り、安全に使用できます。

2番目のケースでは、DAOメソッドREQUIREDがない場合とほぼ同じように機能します。@Transactional唯一の微妙な違いは、例外時のロールバックの動作にあります。例外 (トランザクションのロールバックを引き起こすもの) がトップレベルのメソッドだけでなく、任意のトランザクション メソッドの境界を通過する場合、トランザクションは「ロールバックのみ」としてマークされます。 DAO メソッドからスローされたロールバックの原因となる例外をキャッチして、トランザクションをコミットすることはできません。

REQUIRES_NEWあなたの場合、内部トランザクションと外部トランザクションを別々にロールバックできるようにしたい場合にのみ必要です。

于 2013-08-11T13:40:08.503 に答える