web-dev-qa-db-ja.com

SpringのJdbcTemplateとトランザクション

JdbcTemplateを使用する場合、トランザクションを明示的に構成する必要がありますか?

私のコードレイアウトは次のようになります。

私は、UserServiceに注入されるUserDaoを用意します。その後、コントローラーがUserServiceのメソッドを呼び出します。

トランザクションを可能な限り単純化したいので、トランザクションをスパンするために複数のデータベース呼び出しを行う必要はありません。

デフォルトでは、設定ファイルで何かをする必要がありますか、または@Transactionアノテーションはどこにありますか?

コントローラで、userServiceとaccountServiceに対して2つの呼び出しを行う必要があるとしましょう。トランザクションに明示的にラップできますか?

userService.updateUser(user);
accountService.updateXXX(...);
18
loyalflow

はい、JdbcTemplateはトランザクション管理の代わりにはなりません。それでもデータベーストランザクションのメリットがあるため、userService.updateUserdatabaseトランザクションで動作しますが、accountService.updateXXX失敗、userService.updateUserしないロールバックします。

AOPを使用したくない場合は、代わりに TransactionTemplate を使用できます。 Spring Reference Documentationprogrammatic transaction management を参照してください。

これまでに見たパターンの1つは、MVCコントローラークラスがビジネスサービスを呼び出すことです。これにより、操作がカプセル化されます。次に、ビジネスクラスのメソッドに注釈を付けることができます@Transactional

25
David Grant

コントローラーがユーザーとアカウントでいくつかのことを行い、すべてを1つのトランザクション内で実行したい場合は、そのすべてを行う1つのメソッドを持つサービスが必要です。 DAOごとに1つのサービスを作成するのは良い考えではありません。DAOの何もしないラッパーになってしまい、データベースがDAOの呼び出しごとに個別のトランザクションを作成する必要があるため、処理が遅くなるためです。必要以上に多くの作業。

サービスは、コントローラーまたはそれを呼び出す他のユーザーに機能を提供する必要があります。私は、ある種のユーザーにとって役立つ特定の機能をサービスが提供するという考えでサービスを作成しようとしています。

13
Nathan Hughes