発生した問題
トランザクション管理において環境依存の問題が発生:
- 検証環境: トランザクションが正常にロールバック
- 本番環境: ロールバックが失敗し、意図せずコミットされる
システム環境
共通構成
- SpringBoot 2.7
- データベース: Azure SQL Database
環境別構成
項目 | 検証環境 | 本番環境 |
---|---|---|
アプリケーションサーバ | Tomcat 9 | Open Liberty 22.0 |
問題の調査
調査プロセス
- 開発環境(Tomcat)での動作確認
- 問題の再現せず
- 環境差分の特定
- アプリケーションサーバの違いに着目
- 開発環境でのOpen Liberty検証
- 問題の再現に成功
エラー内容
スタックトレース
org.springframework.transaction.TransactionSystemException: UOWManager transaction processing failed;
nested exception is com.ibm.wsspi.uow.UOWException: java.lang.LinkageError:
com/ibm/websphere/uow/UOWSynchronizationRegistry.registerInterposedSynchronization
原因分析
トランザクションマネージャーの競合が発生:
- Spring組み込みトランザクション管理機能
- Open LibertyのJTAトランザクション管理機能
- 両者が同時に有効化され、競合状態に
解決策
設定変更
JVM引数に以下を追加し、SpringBootのJTA自動構成を無効化:
# jvm.options
-Dspring.jta.enabled=false
技術解説
Java Transaction API (JTA)
- Jakarta EE(旧Java EE)の標準API
- 分散トランザクション処理を実現するためのインターフェース
- 主な機能:
- トランザクションの開始・コミット・ロールバック
- 複数のXAリソース間でのトランザクション調整
- トランザクション境界の管理
SpringBootのトランザクション管理
- 宣言的トランザクション管理(
@Transactional
) - プログラマティックトランザクション管理(
TransactionTemplate
) - JTAとの統合オプション
教訓
-
環境差異の重要性
- ミドルウェアの違いによる影響を事前確認
- 各環境での動作検証の必要性
-
トランザクション管理の設計ポイント
- フレームワークの重複を避ける
- 明示的な設定の重要性
- 環境依存の考慮
参考