問題タブ [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.
java - @OrderColumn を使用して @ManyToMany に基づくリストにギャップが表示されるのはなぜですか
データベースに永続化された Ticket オブジェクトのキューがあります。キューを含むエンティティは次のようになります。
あるキューから別のキューにチケットを移動する操作 (これを changeStatus と呼びます) と、新しいチケットをキューの最後に追加する操作 (この newTicket と呼びます) があります。
2 つの操作が同じキューでインターリーブする場合、操作は基本的に機能しますが、キューに「ギャップ」が生じます。データベースでは、これは、0、1、2、4 のように、テーブルの順序列に欠落したインデックスのように見えます。キューが Java にロードされると、欠落したインデックスはキュー内の null 要素になります。
StoreQueueCollection オブジェクトでペシミスティック ロックを使用して、一貫性のないインターリーブ更新を防止していますが、期待どおりに機能していません。追加のログを使用すると、次のような奇妙なシーケンスが表示されます。
すべてのロックは LockModeType.PESSIMISTIC_WRITE であり、スコープは PessimisticLockScope.EXTENDED です。
この一連の実行の後、キュー内の null エントリをチェックする別のスレッドからアサーションがトリガーされます。不思議なことに、行列は基本的に正しい(Xを削除、Yを末尾に追加)のですが、Yの前の注文欄に隙間があります。
私たちが間違っていることについての提案は大歓迎です!
hibernate - grails/hibernate: クレテリアを使用して悲観的ロックを追加
ドキュメントhttp://grails.org/doc/latest/guide/GORM.html#lockingに示されているように、クレテリアに悲観的ロックを追加しようとしました が、例外がありました:
「エラー util.JDBCExceptionReporter - 機能がサポートされていません: "FOR UPDATE && JOIN"; SQL ステートメント: ... org.hibernate.exception.GenericJDBCException: クエリを実行できませんでした」
次の 2 か所にロックを追加しようとしました。
と
追加の質問: アソシエーションを悲観的にロックするのは正しい方法ですか?
ありがとうございました
ドメイン
データソース.groovy
hibernate - Hibernate: 基準の lockMode が機能しない
休止状態のロック モードを指定する必要があります。私がやっていること:
しかし、提供されたクエリを見ると、休止状態はまだ提供されていませんSELECT FOR UPDATE
SELECT FOR UPDATE
休止状態に節を作成させるにはどうすればよいですか? それが機能する場合のみ、次のように表示されます。
しかし、もっと複雑なクエリを使用する必要があります。
hazelcast - Hazelcasts Entry Processor は悲観的 (明示的) ロックとどう違うのですか?
内部的には、エントリ プロセッサは悲観的ロックとしてキーのロックとロック解除も実行します。しかし、エントリ プロセッサはペシミスティック ロックよりも効率的です。これらの違いは何ですか?
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ドライバーに起因すると思いますが、よくわかりません。どこに問題があるかについて何か考えはありますか?別の戦略を使用する必要がありますか? 前もって感謝します。
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
ですか?