2

次のSpringFrameworkエラーメッセージが表示されます。

Invocation of getLogoForGlobalConext() in class $Proxy44 threw exception
org.springframework.transaction.UnexpectedRollbackException:
Transaction rolled back because it has been marked as rollback-only
at template/includes/macros.vm line 1651, column 43

1651行目を開いmacros.vmて調べたところ、次のようになりました。

#set ($globalLogo = $spaceManager.getLogoForGlobalContext());

$Proxy44私の調査によると、実際には$spaceManager変数(またはのインスタンス)であるように見えますDefaultSpaceManager.java

このメッセージはランダムに表示され、WebアプリがWebサーバー/データベースのどこかにある画像/添付ファイルをダウンロードしようとしたときに表示されます。

attachmentmanagerはSpringのトランザクション管理によって管理され、イメージ/添付ファイルがダウンロードされるときに次のトランザクション属性が使用されます。

  1. 伝播-添付ファイルマネージャーのすべてのメソッド

  2. 伝播と読み取り専用-「get」で始まる添付ファイルマネージャーのすべてのメソッド。

属性はSpringFramework-第9章トランザクション管理で定義されています。私が考えているのは、トランザクションにタイムアウトを設定する必要があるということです(無限大に設定するなど)。

4

1 に答える 1

2

getter メソッドの 1 つがデータベースへの書き込みを実行していたことが判明しました。具体的には、数分ごとにいくつかの情報でキャッシュを更新していました。この更新が発生すると、UnexpectedRollbackExceptionがスローされました。このトランザクションは、上記のトランザクション属性で定義されているように「読み取り専用」であると想定されているため、getter 操作中に更新を実行することはできません。

getter メソッドを変更して、キャッシュへの更新を実行せず、有効期限が切れた場合でも単にキャッシュを使用するようにすると、エラーはなくなりました。

これが他の誰かに役立つことを願っています。

于 2012-01-21T00:20:21.550 に答える