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