JdbcTemplateを使用する場合、トランザクションを明示的に構成する必要がありますか?
私のコードレイアウトは次のようになります。
私は、UserServiceに注入されるUserDaoを用意します。その後、コントローラーがUserServiceのメソッドを呼び出します。
トランザクションを可能な限り単純化したいので、トランザクションをスパンするために複数のデータベース呼び出しを行う必要はありません。
デフォルトでは、設定ファイルで何かをする必要がありますか、または@Transaction
アノテーションはどこにありますか?
コントローラで、userServiceとaccountServiceに対して2つの呼び出しを行う必要があるとしましょう。トランザクションに明示的にラップできますか?
userService.updateUser(user);
accountService.updateXXX(...);
はい、JdbcTemplate
はトランザクション管理の代わりにはなりません。それでもデータベーストランザクションのメリットがあるため、userService.updateUser
はdatabaseトランザクションで動作しますが、accountService.updateXXX
失敗、userService.updateUser
はしないロールバックします。
AOPを使用したくない場合は、代わりに TransactionTemplate を使用できます。 Spring Reference Documentation の programmatic transaction management を参照してください。
これまでに見たパターンの1つは、MVCコントローラークラスがビジネスサービスを呼び出すことです。これにより、操作がカプセル化されます。次に、ビジネスクラスのメソッドに注釈を付けることができます@Transactional
。
コントローラーがユーザーとアカウントでいくつかのことを行い、すべてを1つのトランザクション内で実行したい場合は、そのすべてを行う1つのメソッドを持つサービスが必要です。 DAOごとに1つのサービスを作成するのは良い考えではありません。DAOの何もしないラッパーになってしまい、データベースがDAOの呼び出しごとに個別のトランザクションを作成する必要があるため、処理が遅くなるためです。必要以上に多くの作業。
サービスは、コントローラーまたはそれを呼び出す他のユーザーに機能を提供する必要があります。私は、ある種のユーザーにとって役立つ特定の機能をサービスが提供するという考えでサービスを作成しようとしています。