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

sql-server - 楽観的ロックと悲観的ロック

楽観的ロックと悲観的ロックの違いを理解しています。一般的にどちらを使用するかを誰かに説明してもらえますか?

また、クエリを実行するためにストアド プロシージャを使用しているかどうかによって、この質問に対する答えは変わりますか?

ただし、楽観的とは「読み取り中にテーブルをロックしない」ことを意味し、悲観的とは「読み取り中にテーブルをロックする」ことを意味します。

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

sql-server - selectステートメントでのSQL行ロック

ユーザーが編集する行を選択する ASP.Net Web ページがあります。その行で行ロックを使用したいのですが、ユーザーが編集を終了して更新すると、別のユーザーがその行を編集できるようになります。

ありがとうございました

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

hibernate - ペシミスティック ロックがクエリ API で機能しない

上記のクエリを作成しましたが、クエリが生成されておらずfor update、同時更新が発生しています。

バージョン 3.5.2 を使用していますが、Criteria APIにバグがあります。クエリ API にも同じバグがありますか、それとも何か問題がありますか?

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

orm - JPA同期エンティティアクセサー

設定は次のとおりです。エンティティクラスには、遅延ロードされる他のエンティティのコレクションがあります。秘訣は、データ関連の作業を実行する必要があることです(たとえば、コレクションの要素を使用して特定のチェックサムを計算したい)。

ここでの秘訣は、「データ計算中に誰かがエンティティを更新した」などの競合状態を絶対に避けたいということです。通常の状況では、ゲッター/セッターの同期を宣言するだけで、満足します。しかし、私が理解している限り、他のスレッドがデータベースからエンティティの状態を更新することを決定した場合、チェックサムを計算している最中に、「同期された」メソッドを完全に無視します(フィールドに直接アクセスします)。

私は間違っているかもしれません。したがって、問題は、最初のチェックサム計算時に、エンティティの一部またはエンティティ全体へのアクセスを「ロック」する方法はありますか?

前もって感謝します!PS問題を説明するためのコードスニペットが必要な場合は、お知らせください。これまでのところ、質問はかなり明確だと思います。

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

jpa - JPAのUPSERTにはLockModeType.PESSIMISTIC_WRITEで十分ですか?

JPA concurrency に関するこの記事を読みましたが、厚すぎるか、十分に明示的ではありません。

データベース制御のアトミック update-if-found-else-insert 操作 (an UPSERT) を実行しようとしています。

私の貧弱な頭脳には、もちろんトランザクション内で、 のロックモードで名前付きクエリを実行し、結果PESSIMISTIC_WRITEが返されるかどうかを確認してから、persist()またはその後のいずれかを実行できるように見えますupdate()

私がはっきりしていないのは、この操作をPESSIMISTIC_WRITEロックとロックで行うことの違いPESSIMISTIC_READです。私は文を読みました--それPESSIMISTIC_READは反復不可能な読み取りを防ぐことを意図していることを理解しています、そしてPESSIMISTIC_WRITE...まあ、多分私はそれをあまりよく理解していません:-) --しかし、その下には単なる SQLSELECT FOR UPDATEです、ええ? 両方の場合において?

0 投票する
0 に答える
660 参照

ado.net - System.Transactions を使用した行レベルの更新ロック

次のコードを含む MSSQL プロシージャがあります。

同じ動作を、OleDb 接続、コマンド、およびトランザクションを使用して同じ結果を達成するコンポーネントに移そうとしています。(これは、上記の SecurityAssignment テーブルを使用するセキュリティ コンポーネントです。そのテーブルが MSSQL、Oracle、または Db2 のいずれにあるかに関係なく動作するようにしたい)

上記のSQLが与えられた場合、次のコードを使用してテストを実行すると

Subject.GetAssignmentsHavingUser は上記の sql を実行し、結果のコレクションを返します。backgroundWork は、次のようにテーブル内の行を更新するアクションです。

次に、テストによって返される foregroundResults は、backgroundWork アクションで行われた変更を反映する必要があります。

つまり、SQL によって UPDLOCK と ROWLOCK が適用された SecurityAssignment テーブルの行のリストを取得し、それらの行に対する後続のクエリは、その更新ロックが解放されるまで返されません。したがって、テストの foregroundResult には、背景スレッド。

これはすべてうまくいきます。

ここで、データベースに依存しない SQL で同じことを行い、OleDb トランザクションと分離レベルを使用して同じ結果を達成したいと考えています。そして、私は私の人生でそれを行う方法を理解することはできません。それは可能ですか、またはこの行レベルのロックはデータベースレベルでのみ適用されますか?

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

nhibernate - NHibernate - 悲観的ロックが機能しない

この他の質問のフォローアップ。

上記の質問で説明したように、並行性の問題に対して悲観的ロックを実装しようとしています (その質問に自由に追加してください)。しかし、それは私にとってはうまくいきません。

私は非常に簡単なテストを行います: 私は 2 つの別々のサイトを実行しており、どちらもカウンターを 500 倍に増やします。私はそれらを同時に実行します。最後に、テーブルの特定の列の値が 1000 であることを期待しています。

これがコードです。もちろん、これは製品コードではありませんが、テスト コードであろうとなかろうと、それでも動作するはずですよね?

GetByIdメソッドは LockMode.Upgrade を使用します。

ここで、NHProfiler を使用すると、次の SQL ステートメントが表示されます。

SELECT Id FROM 'User' WHERE Id = 42 for update

しかし、結果は約530の値になるため、同時実行により失われた更新の約半分です。私は何を間違っていますか?このテストでは、二次キャッシュを無効にしました。間違ったロックモードを使用していませんか? 分離レベルを指定する必要がありますか? 他に何か?前もって感謝します。

編集: FluentNhibernate 構成:

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

sql-server - SQL Server、誤解を招くXLOCKと最適化

私が行った最近のテストと読書から、XLOCKの「X」(排他的)名の部分は誤解を招くようです。実際には、UPDLOCK以上のロックはありません。それが排他的である場合、それは外部SELECTを防ぎますが、そうではありません。

読んでもテストでも、両者の違いはわかりません。

XLOCKが排他ロックを作成するのは、TABLOCKとともに使用する場合のみです。私の最初の質問は、「なぜこの粒度でのみなのか」です。

さらに、私は次のように述べているブログに出くわしました:

ただし、XLOCKヒントに注意してください。SQL ServerはXLOCKヒントを効果的に無視します!SQL Serverが、最も古いオープントランザクション以降にデータが変更されたかどうかをチェックする最適化があります。そうでない場合、xlockは無視されます。これにより、xlockヒントは基本的に役に立たなくなるため、避ける必要があります。

誰かがこの現象に遭遇しましたか?

私が見ていることに基づいて、このヒントは無視されるべきであるように思われます。

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

mysql - mysql トランザクション悲観的ロックが破損しています

私は休止状態、innodb、および mysql を使用しています。非常に長い休止状態トランザクションの開始時に (特定のテーブル行で) 悲観的ロックを取得しています。時折、このトランザクションを開始するプログラムを実行し、スタンドアロン アプリケーション モードで Eclipse を実行し、アプリケーションを強制的に停止すると (強制的にスレッドが死にます)、次のシナリオが発生します。

MySQL は、トランザクションが中止されたことを認識していません。次にアプリケーションを実行すると、MySQL はその行がロック解除されていることを認識する必要がありますが、(その長いトランザクションの開始時に) 悲観的ロックを取得する関数がブロックされます。

再び動作させる唯一の方法は、MySQL デーモンを停止して再起動することです。その後、ペシミスティック ロックが取得されます。

これは本当に気になります。これは、例外またはクリーン シャットダウン以外の方法で VM を終了すると、MySQL が壊れた状態のままになり、MySQL デーモンの再起動が必要になる可能性があることを意味します。たとえば、実行中のアプリケーションを中止するためにEclipseを使用するのと同じように、Tomcatをシャットダウンして再起動する通常の方法を使用しています。

他の人がこの問題に遭遇しましたか? threaddeath を伴わない tomcat を停止するクリーンな方法はありますか? 悲観的ロック (更新を選択) を取得したトランザクションの途中で、MySQL が threaddeath の影響を受けないようにすべきではありませんか?

$CATALINA_HOME/bin/shutdown.sh で tomcat を停止しています

アンディ

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

entity-framework-4 - EntityFrameworkを使用した「次の番号」シナリオ

私はEntityFrameworkで遊んでいますが、これまでのところ、EntityFrameworkをよく使用しています。しかし、これまでに行ったことはすべて、ほとんどの場合にうまく機能する楽観的なロックを前提としています。ただし、次のシナリオがあります。

  1. アプリケーション全体のデータを保持する1行のみのSQLServerテーブル
  2. 行には「NextAvailableNumber」という名前の列が含まれています
  3. アプリケーションは、数値を読み取り、1ずつインクリメントして、更新する必要があります

上記は、競合するプロセスが最初のトランザクションが完了するまで番号を取得するのを待たなければならないことを保証する必要があります。以前はテーブルロックを使用してこれを実行していましたが(行が1つしかないため)、LINQ to Entitiesを使用してこれを実行する方法を知りたいですか?

ありがとう、

ジムK。