Springトランザクションアノテーションが無効になってしまう場合の対処法
Springトランザクションアノテーション使用時の無効化問題が生じた場合、以下の解決策を試してください。
- トランザクションマネージャ(たとえばDataSourceTransactionManager)がSpring設定ファイルで設定されており、@EnableTransactionManagementアノテーションが記載されていることを確認する。
- トランザクションメソッドには@Transactionalアノテーションが必ず設定されていることを確認します。Springはトランザクションを実装するためにプロキシ機構を使用するため、トランザクションアノテーションはpublicメソッドに適用する必要があります。
- Springコンテナ管理されているBeanに付与されたメソッドにのみトランザクションアノテーションを付けること。Springコンテナが作成したBeanではなくnewキーワードによって作成されたオブジェクトのメソッドにトランザクションアノテーションを付けてもトランザクションは機能しない。
- トランザクションメソッドを呼び出すコードは必ずSpringコンテナで取得したBeanであるようにしてください。同じクラス内でトランザクションメソッド呼び出しを行った場合、そのクラスがSpringコンテナで取得したBeanでない場合、トランザクションアノテーションは機能しません。
- 例外処理のしくみが有効かどうかを確認します。例外を捕捉した後にトランザクションのロールバックが発動していない可能性があります。
- トランザクション伝播振る舞いが適切に設定されていることを確認してください。トランザクションメソッドがトランザクションアノテーションを持つ別のメソッドを呼び出す場合、トランザクション伝播振る舞いが正しく設定されていなければ、トランザクションアノテーションの効果がなくなる可能性があります。
- トランザクションアイソレーションレベルが適切に設定されていることを確認してください。トランザクションメソッドがトランザクションアイソレーションレベルのデフォルトで動作している場合で、設定されたデータベースまたはデータソースに異なるアイソレーションレベルが使用されていると、トランザクションアノテーションが無効になる可能性があります。
- 他のAOPプロキシの仕組みがトランザクション注釈の動作に影響を与えていないか確認する。例えば、AspectJアノテーションを使用してアスペクトを織り込むと、トランザクション注釈が機能しなくなる可能性がある。
それでも解決しない場合は、コードを手で書いてトランザクションを管理する、 プログラム的トランザクション管理があります。こちらはやや複雑ですが、トランザクションの動きをより柔軟に制御できます。