問題タブ [staleobjectstate]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
java - org.hibernate.StaleObjectStateException をキャッチできません
StaleObjectStateException をキャッチできないのでしょうか? 私は StaleObjectStateException で catch ブロックを持っているので、メソッドがこのエラーをスローすると、この catch ブロックに来ますが、同じ例外が再びスローされます。この例外が発生する理由はわかっていますが、例外をキャッチしてさらに処理を進めたいと考えています。
hibernate - grails、行が別のトランザクションによって更新または削除されました
update
コントローラーメソッドでいくつかのサービスを呼び出そうとしています。残念ながら、これは a にStaleObjectStateException
なり、サービスメソッドを「単に」呼び出しているだけなので、その理由はよくわかりません。transactional
例外は次のとおりです。
..そして、コントローラーの update メソッドの重要な部分:
2 つのサービス方法:
grails - grails はいつオブジェクトの古さをチェックしますか?
私は Grails 2.5.1 を使用しています。サービス メソッドを呼び出すコントローラーがあり、StaleObjectStateException
. サービス メソッドのコードにobj.save()
は、例外を無視するだけの呼び出しの周りに try キャッチがあります。ただし、これらの競合のいずれかが発生するたびに、ログにエラーが出力され、クライアントにエラーが返されます。
私の GameController コード:
私の GameService コード:
スタック トレースは、私のメソッドから例外が生成されたことを示しGameController.finish
ていますが、それは私のメソッド内のコードを指していませんGameService.scoreGame
。これは、オブジェクトの保存/更新が試行されたときではなく、トランザクションが開始されたときに Grails が古さをチェックすることを意味しますか?
私はこの例外に何度も遭遇しましたが、通常はオブジェクト グラフをトラバースしないことで修正します。
たとえば、この場合、game.rounds
参照を削除して次のように置き換えます。
しかし、それは、トランザクションが作成されたときに古さがチェックされないことを意味し、それは常に実用的であるとは限らず、私の意見では、Grails の遅延コレクションの目的を無効にします。すべての関連付けを自分で管理したい場合は、そうします。
Pessimistic and Optimistic Lockingに関するドキュメントを読みましたが、コードはそこの例に従います。
Grails (GORM) が古さをチェックする方法/タイミング、およびそれを処理する場所について詳しく知りたいですか?
java - コンカレント API LayoutLocalService.addLayout が LayoutSetLocalService で StaleObjectStateException をスローする
アップデート
Liferay チケットが承認されました。開発中の解決策: https://issues.liferay.com/browse/LPS-82954
状況
私のコンテキストは、liferay ポートレットを介した liferay レイアウトの並行インポートです。春で構築します。Liferay dxpで実行しているとき; レイアウトを追加するための API 呼び出しは、StaleObjectStateException をスローします。( https://github.com/liferay/liferay-portal/blob/d969e0e839db9ea64267f7bff0a76be93cd26fa0/portal-impl/src/com/liferay/portal/service/impl/LayoutLocalServiceImpl.java )
この例外は、対応する LayoutSet で API が内部的に更新を行うときに発生します (レイアウトが追加されたそのグループの PageCount を少し前に更新します)。
これは、シングル スレッド実行では発生しません。
行動
- まず、その通話を同期しました..より良い結果はありません
- その間、トランザクション自体が同期実行ブロック内にない可能性があるため、スレッドを同期するだけでは役に立たないということを読みました。したがって、トランザクションの注釈も追加しました。.. より良い結果なし
これまでのところ、次の洞察を得ました。
LayoutSetLocalService.updatePageCount() にバグがあります: 更新された LayoutSet が返されません.. したがって、(Liferay 7/DXP が導入された場合) LayoutSet の mvcc バージョンはインクリメントされません。..しかし、これが私の状況に影響を与えることはありません)。
それに取り組む機会があるかどうか、だれかが私にヒントを与えることができますか?
- それとも、これは楽観的ロックの結果であり、私はそれと一緒に暮らす必要がありますか?
- スレッドを作成するときにパズルを見逃しましたか? たぶんいくつかの奇妙な..私の休止状態のセッションを構成する...こと?
コードの抜粋
-> 利用可能なテスト プロジェクト: https://github.com/andrebiegel/liferay-layout-issue.git