トランザクション境界(BEGIN / COMMIT / ROLLBACK)を明示的に宣言していない場合でも、すべてのデータベースステートメントは物理トランザクションのコンテキスト内で実行されます。
トランザクション境界を明示的に宣言しない場合、各ステートメントは個別のトランザクション(autocommit
モード)で実行する必要があります。ご使用の環境でスレッドごとの接続バインディングを処理できない場合は、ステートメントごとに1つの接続を開いたり閉じたりすることもできます。
サービスをとして宣言する@Transactional
と、トランザクション期間全体で1つの接続が提供され、すべてのステートメントがその単一の分離接続を使用します。これは、最初に明示的なトランザクションを使用しないよりもはるかに優れています。
大規模なアプリケーションでは、多数の同時リクエストがあり、データベース接続の取得リクエストレートを下げると、アプリケーション全体のパフォーマンスが確実に向上します。
JPAは読み取り操作でトランザクションを強制しません。トランザクションコンテキストの開始を忘れた場合にのみ、書き込みのみがトランザクション必須例外をスローします。それでも、読み取り専用トランザクションの場合でも、常にトランザクション境界を宣言する@Transactional
ことをお勧めします(Spring では、読み取り専用トランザクションにマークを付けることができるため、パフォーマンスが大幅に向上します)。