Spring、Hibernate、JPA Entity Manager を使用しています。UI の異なる領域を (jquery/ajax を介して) 同時にフェッチする場合、JPA Entity Manager へのアクセスを同期したいと思います。そうしないと、コレクション例外への共有参照が発生します。どうすればこれを達成できますか? entitymanager で get/save などを呼び出すサービス メソッドをバックエンドで呼び出すコントローラーがあります。
質問する
3280 次
1 に答える
1
特定のモードでオブジェクトにロックを適用できます。
- エンティティマネージャー:
entityManager.lock(entity, LockModeType.OPTIMISTIC);
- クエリ:
query.setLockMode(LockModeType.OPTIMISTIC);
- NamedQuery:lockMode要素
ロックモードは&toOPTIMISTIC
と同義です。READ
OPTIMISTIC_FORCE_INCREMENT
WRITE
編集:ドキュメントから
トランザクションT1がバージョン管理されたオブジェクトに対してタイプLockModeType.OPTIMISTICのロックを要求する場合、エンティティマネージャは、次のいずれの現象も発生しないようにする必要があります。
P1(ダーティリード):トランザクションT1は行を変更します。次に、別のトランザクションT2がその行を読み取り、T1がコミットまたはロールバックする前に、変更された値を取得します。トランザクションT2は最終的に正常にコミットします。T1がコミットするかロールバックするか、およびT2がコミットする前かロールバックするかは関係ありません。
P2(繰り返し不可の読み取り):トランザクションT1が行を読み取ります。次に、T1がコミットする前に、別のトランザクションT2がその行を変更または削除します。両方のトランザクションは最終的に正常にコミットします。
ロックモードは常に現象P1とP2を防ぐ必要があります。
于 2012-06-08T11:52:22.340 に答える