LoginSignup
0
0

[SpringBoot] トランザクションマネージャーの競合でロールバックされない OpenLiberty

Last updated at Posted at 2023-07-19

概要

検証環境では正常にロールバックされるのに、
本番機ではロールバックされずに勝手にコミットまでされるという事象が発生した。

背景

・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

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0