概要
検証環境では正常にロールバックされるのに、
本番機ではロールバックされずに勝手にコミットまでされるという事象が発生した。
背景
・SpringBoot2.7
・@Transactionalアノテーションを使ったトランザクション管理
・DBMSはAzureSQLを使用していた
検証機と本番機では使用しているミドルウェアが異なっていた
- 検証環境
- Tomcat9
- 本番環境
- Open Liberty 22.0
調査
本番機には出力レベルの設定の絡みなのか調査に有効なログは出力されておらず、
開発機・検証機ではミドルウェアは軒並みTomcatを使用していたため、再現に時間がかかった・・
検証機と本番機の大きな違いとしてミドルウェアの相違があったため、
開発環境にOpenLibertyをインストールしてようやく再現。
ロールバック失敗時に、下記のスタックトレースが出力された。
スタックトレース
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
原因
スタックトレースを調査したところ、
トランザクションマネージャーの競合が重複したことによるエラーの模様。
対応
OpenLibertyのJVM引数に下記を追加することで、のJTA 自動構成を使用不可にすることで、
競合を解消。
jvm.options
-Dspring.jta.enabled=false
用語解説
Java Transaction API (JTA)
Jakarta EE(旧・Java EE)のAPIの1つであり、XAリソース間の分散トランザクション処理を扱う。
参考文献
Java Transaction APIとは(Wiki)
Distributed Transactions with JTA
同様にはまった人のstack overflow