問題タブ [pessimistic-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 投票する
1 に答える
233 参照

java - @OrderColumn を使用して @ManyToMany に基づくリストにギャップが表示されるのはなぜですか

データベースに永続化された Ticket オブジェクトのキューがあります。キューを含むエンティティは次のようになります。

あるキューから別のキューにチケットを移動する操作 (これを changeStatus と呼びます) と、新しいチケットをキューの最後に追加する操作 (この newTicket と呼びます) があります。

2 つの操作が同じキューでインターリーブする場合、操作は基本的に機能しますが、キューに「ギャップ」が生じます。データベースでは、これは、0、1、2、4 のように、テーブルの順序列に欠落したインデックスのように見えます。キューが Java にロードされると、欠落したインデックスはキュー内の null 要素になります。

StoreQueueCollection オブジェクトでペシミスティック ロックを使用して、一貫性のないインターリーブ更新を防止していますが、期待どおりに機能していません。追加のログを使用すると、次のような奇妙なシーケンスが表示されます。

すべてのロックは LockModeType.PESSIMISTIC_WRITE であり、スコープは PessimisticLockScope.EXTENDED です。

この一連の実行の後、キュー内の null エントリをチェックする別のスレッドからアサーションがトリガーされます。不思議なことに、行列は基本的に正しい(Xを削除、Yを末尾に追加)のですが、Yの前の注文欄に隙間があります。

私たちが間違っていることについての提案は大歓迎です!

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

hibernate - grails/hibernate: クレテリアを使用して悲観的ロックを追加

ドキュメントhttp://grails.org/doc/latest/guide/GORM.html#lockingに示されているように、クレテリアに悲観的ロックを追加しようとしました が、例外がありました:

「エラー util.JDBCExceptionReporter - 機能がサポートされていません: "FOR UPDATE && JOIN"; SQL ステートメント: ... org.hibernate.exception.GenericJDBCException: クエリを実行できませんでした」

次の 2 か所にロックを追加しようとしました。

追加の質問: アソシエーションを悲観的にロックするのは正しい方法ですか?

ありがとうございました

ドメイン

データソース.groovy

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

hibernate - Hibernate: 基準の lockMode が機能しない

休止状態のロック モードを指定する必要があります。私がやっていること:

しかし、提供されたクエリを見ると、休止状態はまだ提供されていませんSELECT FOR UPDATE

SELECT FOR UPDATE休止状態に節を作成させるにはどうすればよいですか? それが機能する場合のみ、次のように表示されます。

しかし、もっと複雑なクエリを使用する必要があります。

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

hazelcast - Hazelcasts Entry Processor は悲観的 (明示的) ロックとどう違うのですか?

内部的には、エントリ プロセッサは悲観的ロックとしてキーのロックとロック解除も実行します。しかし、エントリ プロセッサはペシミスティック ロックよりも効率的です。これらの違いは何ですか?

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

java - Oracle を使用した JPA での悲観的なロックが機能しない理由

さまざまな JBoss ノードで実行される cron ジョブ用のある種のセマフォを実装しようとしています。データベース (Oracle 11g) をロック メカニズムとして使用して、1 つのテーブルを使用して異なるノードの cron ジョブを同期しようとしています。表は非常に単純です。

そのため、ジョブが開始されると、テーブル内でその cronjobtype のエントリが検索され、既に実行されているかどうかがチェックされます。そうでない場合は、エントリ設定の実行フラグを true に更新します。この最初の選択は、Hibernate と Pessimistic Lock を使用して JPA CriteriaApi で行われます。

これらの操作はすべて、1 つのトランザクション内で行われます。

1 つのプロセスが実行されると、次のクエリが作成されます。

この警告に問題はありません。最初の選択が表示され、次に更新のための選択が表示されるため、Oracle はこの行での他の選択操作をブロックする必要があります。しかし、それがポイントです。クエリはブロックされていないため、2 つのジョブが問題なく入力して選択および更新できます。ロックが機能していません。2 つの cron ジョブを同時に実行すると確認できます。

2 つの接続を使用して SQL ツール (SQLWorkbenchJ) でこの更新を選択しようとしましたが、このツール内でブロッキングが正常に機能しています。しかし、SQL ツールでこれを更新用に選択して cron ジョブを起動すると、ブロックされず、問題なく実行されます。

問題はJPA、Hibernate、またはOracleドライバーに起因すると思いますが、よくわかりません。どこに問題があるかについて何か考えはありますか?別の戦略を使用する必要がありますか? 前もって感謝します。

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

ruby-on-rails - アクティブ レコードのペシミスティック ロックを使用すると、rspec の変更の期待が失敗する

Rails 4.2.0悲観的ロックを使用してカウンターを変更する方法があります

私はRspec 3.1それをそのようにテストするために使用しています

最初のchange(foo, :counter)テストは成功しますが、両方をコメントアウトしない限り、2 番目のテストは失敗change(foo.parent, :counter)します。lock!parent.lock!

失敗したテストをこのように書き直すと、合格します

で動作しないのはなぜexpect{...}.to changeですか?