問題タブ [optimistic-locking]

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.

0 投票する
3 に答える
1783 参照

java - JPAトップリンクで列レベルの楽観的ロックは可能ですか?

optimistic lockingはJPAで勉強し@Version annotationました.DBにバージョン列を追加し、それがどのように管理されているかEntityManagerなど

ドキュメントは、(私自身の言葉で)楽観的ロックはオブジェクトレベルで効果的であると述べています。バージョン定義がエンティティクラスにあるため、確かにそうであることがわかります。

これの意味は:

  1. userA select row_A (db テーブルの行のみ)

  2. userB select row_A

  3. userA は、ユーザー名列の row_A を更新します (ここでバージョンが変更されます)

  4. userB は、username 列の row_A を更新します (optimisticLockException がスローされます)

ここまでは順調ですね。

しかし、ステップ4で考えてみると、

userB update row_A of phoneNumber例えば。

optimisticLockException がまだスローされることはわかっていますが、オブジェクト レベルではなく列レベルでロックする方法はありますか?

私にとっては、列レベルのロックがあればいいのですが、それが可能であっても、それがどのような不利益をもたらすかはわかりません。

0 投票する
1 に答える
1441 参照

java - JPA オプティミスティック ロック バージョンの処理 - バージョン値をクライアント側に運ぶ必要がありますか?

サーバーからクライアントへ、またはその逆に JPA (toplink Essentials) を使用して、エンティティ クラスで楽観的ロック バージョン プロパティを処理する方法を知りたいです。

これがシナリオです。

  1. ブラウザのユーザーからサーバーにリクエストを送信し、個々のユーザー情報を編集するよう求めます。

  2. サーバーはリクエストを処理し、結果をブラウザに返します。サーバーコードは次のようになります。

    EntityManager em = EmProvider.getInstance().getEntityManagerFactory().createEntityManager();

    ユーザー u = (ユーザー)em.find(User.class, myUserId);

    あなたを返します。//ブラウザへの応答

ここで、私の混乱は User table has "version"column foroptimistic lockingです。

つまり、バージョン フィールドの値は、クライアント (私または他のユーザー) が決して使用しない場合でも、クライアントに送り返されます。バージョン フィールドは、サーバー側のコードで使用されます。

バージョン番号をクライアントに送信するのは正しいですか? そうしないと、ユーザーが変更されたデータを含む Web ページの [UPDATE] ボタンをクリックした場合に、バージョン番号を確認する方法がわかりません。

さらに明確にする必要がある場合はお知らせください。

0 投票する
1 に答える
15526 参照

hibernate - Hibernate (JPA): 複数のオブジェクトが変更およびコミットされたときに StaleObjectStateException を処理する方法

シナリオを考えてみましょう: バージョン管理された異なるテーブルから複数の行を含む Db トランザクション。

例: shopLists と製品。shopList に商品 (ショップリストにある商品の量) が含まれていて、商品に現在の在庫がある場合。

shopList を挿入または編集するときに、shopList 内のこれらの製品の在庫を更新して、在庫を一定に保つ必要があります。

そのために、トランザクションを開き、shopList を挿入/更新し、各製品の在庫を更新 (デルタを適用) してから、トランザクションをコミットします。今のところ大したことはありません。

ただし、他のユーザーが共通して 1 つまたは複数の製品を更新した可能性があります。または、shopList 自体を更新することもできます。どちらの場合も、トランザクションをコミットするときに StaleObjectStateException が発生します。

質問: StaleObjectStateException の原因となったテーブルを特定する方法はありますか?

製品が例外を引き起こした場合、関連するすべての製品を DB から更新してから、在庫デルタを再適用できます。そして、それは結構です。shopList が例外を引き起こした場合は、ユーザーが最初からやり直すことができるように、単に問題をユーザーに報告することをお勧めします。

どうもありがとうございました。

0 投票する
1 に答える
1791 参照

java - 子を更新すると、親のバージョン プロパティが増加しない

Hibernate 3.x で JPA 2 を使用しています。2 つの Entity オブジェクト Foo と Bar があり、関係は次のようになります -

今、私の問題は、好きなものをロードして更新した場合、HibernateFooentityManager.find(...)更新を開始し、バージョンのみをインクリメントすることです。オブジェクトの観点からは、Foo の状態も変化しないので、Foo のバージョンもインクリメントするべきではありませんか? ここで、からプロパティ を削除したいと思います。また、更新された場合はインクリメントする必要があります。どうすればこれを達成できますか?nameBarfoo.getBar().setName("someAnotherName");entityManager.merge(foo)BarBar

versionBarversionFooBar

0 投票する
3 に答える
1564 参照

mysql - jpa / spring/hibernateでの単純な楽観的なロックの質問

再試行インターセプターを使用して、基本的な楽観的ロックメカニズムを実装しようとしています。

つまり、responsesCountプロパティを持つオブジェクトクイズがあります。クイズの更新中に楽観的なロック例外がスローされた場合、それぞれの更新メソッドが再試行インターセプターから再度呼び出されます。

再試行されたメソッドは毎回同じバージョン番号番号を持っているため、何かが正しくないということです。このため、何があってもトランザクションは失敗します。

バージョン:10

プロセスA:更新クイズの開始、バージョン10プロセスB:更新クイズの開始、バージョン10プロセスB:更新クイズの終了、バージョン11プロセスA:楽観的な例外がスローされ、更新クイズが発生し、プロセスAを再試行します。再試行されたメソッド内のバージョンは常に10です。

それでは私は何ができますか?トランザクションを成功させるには、バージョンを自動的にインクリメントする必要があります

0 投票する
2 に答える
953 参照

mysql - spring / jpa/hibernateでの楽観的ロックに関する簡単な設計の質問

私はオブジェクトGeneralKnowledgeTestを持っており、ユーザーがそのテストを受けるたびに更新される多くの統計フィールド(ratingsCount、responsesCount、ratingStars ...)が含まれています(takeTest()->トランザクションメソッド)。

多くのユーザーが同時に同じテストを受けている可能性があるため、楽観的ロック(@version)と、楽観的ロック例外がスローされた場合にtakeTestメソッドを再試行するインターセプターを実装することを考えていました。

したがって、takeTestメソッド内では、常に新しいGeneralKnowledgeTestインスタンス(entityManager.find(testId)など)を取得してから、その統計フィールドを更新します。楽観的な例外がスローされた場合、インターセプターは成功するまでtakeTestメソッドを再試行します。

この手順についてどう思いますか。これは、多くのユーザーが同じテストを受けようとしている可能性のあるシステムに楽観的ロックを実装するための良い方法ですか?

PS。楽観的なロック例外がスローされた場合、企業は警告メッセージを表示することを認めないため、スムーズな実行を可能にするためにインターセプターは必須です...

0 投票する
1 に答える
481 参照

optimistic-locking - 同じ TX で OptimisticLockException 後に更新を再試行する方法

私のプログラムでは、行が外部トランザクションによって更新された後に、行の更新を再試行できる必要があります。Hibernate/JPA が をスローOptimisticLockExceptionします。これをキャッチします。再試行すると、JPQL/HQL を介して DB から行を再読み込みしようとしますが、select ステートメントは同じを生成しますOptimisticLockException。行の最新バージョンを再読み取りし、同じトランザクションで更新する方法はありますか?

0 投票する
1 に答える
279 参照

jpa - openjpa が optimisticklockexception をスローする

私はopenjpaとjpaを試しています。私が持っているのは、データベース内の対応するテーブルとして 1 つのエンティティ クラスだけです。エンティティの属性の 1 つはユーザー名であり、db テーブルの対応する行には varchar2(20) があります。私の主な方法では、私が永続化しようとしたものと、ユーザー名が20を超えるエンティティのインスタンスです。私がやっているのは

他の種類の例外を取得することを期待してこれを試しましたが、なぜ楽観的クロック例外が発生するのかわかりません。

ロック設定はありません。つまり、プロパティをロックするためにデフォルト値を使用しています。

ここで何が起こっているか知っている人はいますか?

0 投票する
1 に答える
1222 参照

hibernate - 楽観的ロック (Hibernate) に関する基本的な質問

「楽観的ロック」メカニズムを使用するのは初めてです-休止状態(Jboss内)とコンテナ管理トランザクション(CMT)を使用しています。エンティティの読み取りエンティティの更新の間に、他の誰かが DB の同じエンティティ (行) を更新するシナリオを処理したいと考えています。そのような場合、私は例外をスローしたい..

エンティティに @Version のアノテーションを付けました - のように

これでバージョン管理に十分かどうか、または EntityManager.lock() API を明示的に呼び出す必要があるかどうか、私は混乱しています。

前もって感謝します、

0 投票する
2 に答える
564 参照

nhibernate - nHibernate と同時実行チェック

UnitOfWork パターンを使用して nHibernate 3 を使用して同時実行チェックを実現したいと考えています。

より正確には:

  • 新しいセッション セッションを開く
  • セッションでエンティティをロードし、
  • クローズセッション、
  • 読み込まれたエンティティのデータを編集する時間をユーザーに与えます。
  • 新しいセッションを開き、
  • データの更新
  • セッションを閉じます。

エンティティのバージョンにタイムスタンプを使用しています。

ここに私のマッピングファイルがあります

セッションコンテキストでエンティティを更新する方法がわかりません

SQLでは、このように動作するはずです

ROWSMODIFIED = 1 の場合、更新は成功しました。それ以外の場合、= 0 の場合、ConcurrencyException

Linq2Sql を使用すると、非常に簡単でした。バージョン管理列を作成し、エンティティを新しいセッション コンテキストにアタッチして、更新を試みます。

nHiberate でそれを行うにはどうすればよいですか? サポートされていますか?