- 開発技術
Spring Frameworkにおける@Transactionalアノテーションの概要
- #SpringBoot
@Transactionalアノテーションとは?
【エンジニア募集中】フルリモート可◎、売上/従業員数9年連続UP、平均残業8時間、有給取得率90%、年休124日以上 etc. 詳細はこちらから>
@Transactionalアノテーションは、Springが提供するトランザクション管理のためのアノテーションです。このアノテーションを使用することで、メソッドやクラス全体にトランザクションの境界を定義し、トランザクションの開始、コミット、およびロールバックを制御することができます。
基本的な使用方法
@Transactionalアノテーションは、通常、サービスレイヤーのメソッドに付与されます。以下は基本的な使用例です。
この例では、createUserメソッドがトランザクション内で実行されます。もしこのメソッド内で例外が発生した場合、トランザクションは自動的にロールバックされます。
1 2 3 4 5 6 7 8 9 |
@Service public class UserService { @Transactional public void createUser(User user) { userRepository.save(user); // ここで例外が発生すると、トランザクションはロールバックされる } } |
トランザクションの伝播
@Transactionalアノテーションには、トランザクションの伝播を制御するためのpropagation属性があります。
- REQUIRED(デフォルト): 現在のトランザクションが存在しない場合、新しいトランザクションを開始します。
- REQUIRES_NEW: 常に新しいトランザクションを開始し、既存のトランザクションが存在する場合は一時的にサスペンドします。
- NESTED: 現在のトランザクション内でネストされたトランザクションを開始します。
- SUPPORTS: 現在のトランザクションが存在する場合はそのトランザクションを使用し、存在しない場合はトランザクションを使用しません。
以下はREQUIRES_NEWを用いた例です。
この例では、processOrderメソッドがトランザクションを開始し、processPaymentメソッドが新しいトランザクションを開始します。これにより、支払い処理が独立して管理され、支払いが失敗した場合でも注文処理には影響を与えません。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
@Service public class OrderService { @Transactional public void processOrder(Order order) { // 注文処理のロジック paymentService.processPayment(order); } } @Service public class PaymentService { @Transactional(propagation = Propagation.REQUIRES_NEW) public void processPayment(Order order) { // 支払い処理のロジック } } |
読み取り専用トランザクション
データの変更を行わない読み取り専用のトランザクションを使用する場合は、readOnly属性を設定します。readOnly = trueを指定することで、パフォーマンスの向上や不要なロックの回避が期待できます。
トランザクションのタイムアウト
timeout属性を使用すると、トランザクションのタイムアウトを設定できます。これにより、指定した時間内にトランザクションが完了しない場合、自動的にロールバックされます。
特定の例外でロールバック
デフォルトでは、RuntimeExceptionおよびそのサブクラス、またはErrorがスローされた場合にトランザクションがロールバックされます。rollbackFor属性を使用することで、特定の例外に対してロールバックを指定できます。
以上が、Springの@Transactionalアノテーションに関する簡単な概要です。 適切な設定を守ることで、効率的で信頼性の高いトランザクション管理が実現できます。
【エンジニア募集中】フルリモートも◎(リモート率85.7%)、平均残業8時間、年休124日以上、有給取得率90% etc. 詳細はこちらから>