4

バッチ処理を実行すると、以下の例外が発生します

encountered an error.org.springframework.transaction.UnexpectedRollbackException: Transaction rolled back because it has been marked as rollback-only
    at java.util.concurrent.FutureTask$Sync.innerGet(FutureTask.java:252)
    at java.util.concurrent.FutureTask.get(FutureTask.java:111)

誰かが問題の原因を教えてくれますか?

ありがとう。

4

2 に答える 2

7

おそらく、Bean の 1 つのどこかに、別の Bean でキャッチしたチェック例外がありますが、Spring のトランザクション アドバイスがそれに気づき、トランザクションにロールバックのマークを付けます。

Transactional アノテーションの noRollBackFor プロパティで遊ぶことができます。

于 2013-10-25T18:11:05.067 に答える
5

Spring 管理環境でこの例外が発生する可能性は、トランザクションの伝播が次のように設定されている場合REQUIREDです。

<tx:method name="do*" propagation="REQUIRED" />

次のようなシナリオを考えてみましょう:

Caller -------> [Transactional Method1(m1)] ----------> [Transactional Method2(m2)]

Spring が管理する環境では、トランザクションとの間に違いがlogicalあります。physicalこのlogical設定が適用されるメソッドごとに、トランザクション スコープが作成されます。methodのlogicalトランザクション スコープm1が と異なりm2ます。各logicalトランザクションは、独自のロールバックのみのステータスを個別に決定できます。また、この設定により、外側のトランザクション スコープ (m1 のスコープ) は、内側のトランザクション スコープ (m2 のスコープ) から論理的に独立しています。

ただし、これらのスコープはすべて同じphysicalトランザクションにマップされます。そのため、内側のトランザクションがロールバック対象としてマークされている場合、(外側のトランザクションから例外がスローされなくても) 外側のトランザクションがコミットされる可能性に影響します。

内部トランザクションからスローされた例外があり、ロールバックのマークが付けられている場合。ただし、外部トランザクションから例外がスローされないため、ロールバック自体が決定されていないため、ロールバック (内部トランザクション スコープによってサイレントにトリガーされる) は予期しないものです。そして、UnexpectedRollbackExceptionその時点で対応する がスローされます。

そのため、(外部の呼び出し元が認識していない) 内部トランザクションが暗黙的にトランザクションをロールバックのみとしてマークした場合、外部の呼び出し元はUnexpectedRollbackExceptionまだ commit を呼び出している場合に を受け取ります。これは、コミットの代わりにロールバックが実行されたことを外部の呼び出し元に示します。これは、例外が発生してトランザクションがロールバックされたことをトランザクションの呼び出し元に知らせるための予期された動作です。

于 2013-10-27T14:39:36.463 に答える