[解決済み] トランザクションがロールバックのみとマークされた:原因を見つけるにはどうすればよいですか?
2022-02-12 09:59:06
質問内容
Transactional メソッド内でトランザクションをコミットする際に問題があります。
methodA() {
methodB()
}
@Transactional
methodB() {
...
em.persist();
...
em.flush();
log("OK");
}
methodA()からmethodB()を呼び出すと、メソッドは正常に通過し、ログに"OK"が表示されます。しかし、その後、私は取得します
Could not commit JPA transaction; nested exception is javax.persistence.RollbackException: Transaction marked as rollbackOnly org.springframework.transaction.TransactionSystemException: Could not commit JPA transaction; nested exception is javax.persistence.RollbackException: Transaction marked as rollbackOnly
at org.springframework.orm.jpa.JpaTransactionManager.doCommit(JpaTransactionManager.java:521)
at org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:754)
at org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:723)
at org.springframework.transaction.interceptor.TransactionAspectSupport.commitTransactionAfterReturning(TransactionAspectSupport.java:393)
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:120)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
at org.springframework.aop.framework.Cglib2AopProxy$DynamicAdvisedInterceptor.intercept(Cglib2AopProxy.java:622)
at methodA()...
- メソッドBのコンテキストは、例外の中で完全に欠落しています - これは大丈夫だと思いますが?
-
methodB()内の何かが、トランザクションをロールバック専用とマークしたのでしょうか?どのように私はそれを見つけることができますか?例えば、次のようなことを確認する方法はありますか?
getCurrentTransaction().isRollbackOnly()?
- このように、手順を踏んで原因を探っていくことができました。
どのように解決するのですか?
ようやく問題が理解できた。
methodA() {
methodB()
}
@Transactional(noRollbackFor = Exception.class)
methodB() {
...
try {
methodC()
} catch (...) {...}
log("OK");
}
@Transactional
methodC() {
throw new ...();
}
どうなるかというと、せっかく
methodB
が正しいアノテーションを持つ場合、その
methodC
はしない。例外が発生した場合、2番目の
@Transactional
は最初のトランザクションをとにかくロールバック専用にすることを意味する。
関連
-
[解決済み】Hibernateエラー:同じ識別子値を持つ別のオブジェクトがすでにセッションに関連付けられました。
-
[解決済み】エラー:配列または java.lang.Iterable のインスタンスに対してのみ反復処理を行うことができます。
-
[解決済み】"実引数リストと形式引数リストの長さが異なる"
-
[解決済み] hibernateでResultSetを抽出できない。
-
[解決済み】Javaクラスの "型に解決できない"
-
[解決済み】Eclipseで「公開型 <<classname>> は独自のファイルで定義する必要があります」エラー【重複あり
-
[解決済み] intellijが自動配線リポジトリにタイプのBeanが見つからないと不正確な発言をする件
-
[解決済み] java.sql.SQLException を取得しました。ResultSet が終了した後の操作は許可されません。
-
[解決済み] エラー - trustAnchors パラメータは空であってはなりません。
-
[解決済み】Java: GZIPInputStreamの作成に失敗しました。GZIP形式ではありません
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】エラー:配列または java.lang.Iterable のインスタンスに対してのみ反復処理を行うことができます。
-
[解決済み】StringUtils.isBlank() vs String.isEmpty()
-
[解決済み】"|="の意味は何ですか?(パイプ等号演算子)
-
[解決済み】Javaクラスの "型に解決できない"
-
[解決済み】Javaの部分文字列:「文字列のインデックスが範囲外」。
-
[解決済み】JLabelのテキストを中央に配置するには?
-
[解決済み】Javaのswitch文。定数式が必要だが、定数である
-
[解決済み】Java LinkedListでNodesを使用する
-
[解決済み】intがnullであるかどうかを確認する方法
-
[解決済み】Java: GZIPInputStreamの作成に失敗しました。GZIP形式ではありません