Spring Frameworkにおける@Transactionalアノテーションの概要 

この記事を書いたチーム:tenko
Spring Frameworkにおける@Transactionalアノテーションの概要  株式会社Smallit 技術ブログ

@Transactionalアノテーションとは? 

【エンジニア募集中】フルリモート可◎、売上/従業員数9年連続UP、平均残業8時間、有給取得率90%、年休124日以上 etc.  詳細はこちらから>

@Transactionalアノテーションは、Springが提供するトランザクション管理のためのアノテーションです。このアノテーションを使用することで、メソッドやクラス全体にトランザクションの境界を定義し、トランザクションの開始、コミット、およびロールバックを制御することができます。 

基本的な使用方法 

@Transactionalアノテーションは、通常、サービスレイヤーのメソッドに付与されます。以下は基本的な使用例です。 

この例では、createUserメソッドがトランザクション内で実行されます。もしこのメソッド内で例外が発生した場合、トランザクションは自動的にロールバックされます。 

トランザクションの伝播 

@Transactionalアノテーションには、トランザクションの伝播を制御するためのpropagation属性があります。 

  • REQUIRED(デフォルト): 現在のトランザクションが存在しない場合、新しいトランザクションを開始します。 
  • REQUIRES_NEW: 常に新しいトランザクションを開始し、既存のトランザクションが存在する場合は一時的にサスペンドします。 
  • NESTED: 現在のトランザクション内でネストされたトランザクションを開始します。 
  • SUPPORTS: 現在のトランザクションが存在する場合はそのトランザクションを使用し、存在しない場合はトランザクションを使用しません。 

以下はREQUIRES_NEWを用いた例です。 

この例では、processOrderメソッドがトランザクションを開始し、processPaymentメソッドが新しいトランザクションを開始します。これにより、支払い処理が独立して管理され、支払いが失敗した場合でも注文処理には影響を与えません。 

読み取り専用トランザクション 

データの変更を行わない読み取り専用のトランザクションを使用する場合は、readOnly属性を設定します。readOnly = trueを指定することで、パフォーマンスの向上や不要なロックの回避が期待できます。 

トランザクションのタイムアウト 

timeout属性を使用すると、トランザクションのタイムアウトを設定できます。これにより、指定した時間内にトランザクションが完了しない場合、自動的にロールバックされます。 

 特定の例外でロールバック 

デフォルトでは、RuntimeExceptionおよびそのサブクラス、またはErrorがスローされた場合にトランザクションがロールバックされます。rollbackFor属性を使用することで、特定の例外に対してロールバックを指定できます。 

以上が、Springの@Transactionalアノテーションに関する簡単な概要です。 適切な設定を守ることで、効率的で信頼性の高いトランザクション管理が実現できます。 

【エンジニア募集中】フルリモートも◎(リモート率85.7%)、平均残業8時間、年休124日以上、有給取得率90% etc. 詳細はこちらから>

Smallitのサービス