2

Spring、Hibernate、JPA Entity Manager を使用しています。UI の異なる領域を (jquery/ajax を介して) 同時にフェッチする場合、JPA Entity Manager へのアクセスを同期したいと思います。そうしないと、コレクション例外への共有参照が発生します。どうすればこれを達成できますか? entitymanager で get/save などを呼び出すサービス メソッドをバックエンドで呼び出すコントローラーがあります。

4

1 に答える 1

1

特定のモードでオブジェクトにロックを適用できます。

  • エンティティマネージャー:entityManager.lock(entity, LockModeType.OPTIMISTIC);
  • クエリ:query.setLockMode(LockModeType.OPTIMISTIC);
  • NamedQuery:lockMode要素

ロックモードは&toOPTIMISTICと同義です。READOPTIMISTIC_FORCE_INCREMENTWRITE


編集:ドキュメントから

トランザクションT1がバージョン管理されたオブジェクトに対してタイプLockModeType.OPTIMISTICのロックを要求する場合、エンティティマネージャは、次のいずれの現象も発生しないようにする必要があります。

  • P1(ダーティリード):トランザクションT1は行を変更します。次に、別のトランザクションT2がその行を読み取り、T1がコミットまたはロールバックする前に、変更された値を取得します。トランザクションT2は最終的に正常にコミットします。T1がコミットするかロールバックするか、およびT2がコミットする前かロールバックするかは関係ありません。

  • P2(繰り返し不可の読み取り):トランザクションT1が行を読み取ります。次に、T1がコミットする前に、別のトランザクションT2がその行を変更または削除します。両方のトランザクションは最終的に正常にコミットします。

ロックモードは常に現象P1とP2を防ぐ必要があります。

于 2012-06-08T11:52:22.340 に答える