この記事は機械翻訳のミラー記事です。元の記事にジャンプするにはこちらをクリックしてください。

眺める: 19946|答える: 3

[出典] データベースロック NOLOCK、HOLDLOCK、UPDLOCK、TABLOCK、TABLOCKX

[リンクをコピー]
掲載地 2021/01/14 15:23:14 | | | |
ノーロック
このオプションを選択すると、SQL Serverはロックなしでデータを読み取ったり変更したりします。 この場合、ユーザーは「ダーティデータ」として知られる未コミットトランザクションやロールバックからデータを読み取ることができます。

ホールドロック
このオプションを選択すると、SQL Serverはトランザクション全体が終了するまでこの共有ロックを維持し、その過程でロックを解除しません。

アップドロック
このオプションを選択すると、SQL Serverはデータを読み込む際に共有ロックの代わりにモディエットロックを使用し、トランザクションやコマンドの終了までこのロックを維持します。 このオプションにより、複数のプロセスが同時にデータを読み取れるが、そのプロセスだけがデータを変更できます。

TABLOCK
このオプションを選択すると、SQL Serverはコマンドが終了するまでテーブル全体に共有ロックを適用します。 このオプションにより、他のプロセスはデータの読み取りのみを可能にし、そのデータを変更できません。

パグロック
このオプションがデフォルトであり、選択するとSQL Serverは共有ページロックを使用します。

TABLOCKX(排他的テーブルロック)
このオプションを選択すると、SQL Serverはコマンドやトランザクションが終了するまでテーブル全体にロックをかけます。 これにより、他のプロセスがテーブル内のデータを読み取ったり変更したりするのを防ぎます。

HOLDLOCKはトランザクション全体が完了するまで共有ロックを保持し、ロックされたオブジェクトが不要になった時点で、SERIALIZABLEトランザクション分離レベルに等しい状態でリリースされます

NOLOCK文は共有ロックを発行せずに実行されるため、READ UNCOMMITDトランザクション隔離レベルに等しいダーティリードが許されます

PAGLOCKは複数のページロックを使用し、1つのテーブルロックを使用します

READPASTは、ロックされた行をスキップしてトランザクションを実行させ、READの未コミットトランザクション隔離レベルでは、ページ、ゾーン、テーブルのロックはスキップせず、RIDロックのみをスキップします

ROWLOCKはrowlockの使用を強制します

TABLOCKXは排他的テーブルレベルのロックの使用を強制し、トランザクション中に他のトランザクションがテーブルを使用できないようにします

UPLOCKは共有ロックなしでテーブルを読み取る際に更新の使用を強制します

注:データベース内のテーブルをロックすることの違い
SELECT * FROM table WITH(HOLDLOCK)他のトランザクションはテーブルを読み取ることができますが、更新や削除はできません
SELECT * FROM table WITH (TABLOCKX) その他のトランザクションはテーブルの読み取り、更新、削除ができません




先の:Win10リモートデスクトップデュアルスクリーンディスプレイ
次に:.NET/C# Nethereum [ソースコード付き]を基に ETH ウォレットアカウントと認証パスワードを作成
 地主| 掲載地 2021/01/14 16:53:24 |
TABLOCKXロックのテスト

テストSQLは以下の通りです:


C#コードのテスト:


ディスカバリー、テーブル全体がロックされており、データはトランザクションが実行された場合にのみクエリされます、下図に示されているように:



WITH(TABLOCKX)を削除し、ID 1のデータのみを更新します。テストは以下の通りです:



タスク2とタスク4はID1のデータを必要としないため、クエリは非常に高速で、タスク3とタスク4はトランザクション完了を待ってからクエリを行う必要があります。

データ変更時の挙動

行バージョン管理を用いるコミット済みリードトランザクションでは、ブロッキングスキャンで更新すべき行を選択し、データ値が読み出された際にデータ行に更新ロック(Uロック)が適用されます。 これは、ラインバージョン管理を使わないコミットリードトランザクションと同じです。 あるデータの行が更新基準を満たさない場合、その行に更新ロックが解除され、次の行がロックされてスキャンされます。

アップデートロック(U):2つのトランザクションが先にデータリソースを読み込むデッドロックを防ぐロックモードです。変更時には共有ロックや排他ロックの使用が時にデッドロックを引き起こすことがありますが、アップデートロックの使用はデッドロックの発生を回避できます。 リソースの更新ロックは一度に1つのトランザクションにしか割り当てられず、リソースを修正する必要がある場合は、更新ロックが排他的ロックとなり、そうでなければ共有ロックとなります。

ハイパーリンクのログインが見えます。

 地主| 掲載地 2021/01/28 17:30:51 |
発行:

udpate a
セット列1 = 1
ここでidx = 1
sqlserverがupdate文を実行すると、テーブル全体がロックされます

分析:

構造を見てください。主キーがなければ、行だけをロックすることはできません
 地主| 掲載地 2023/05/02 11:47:24 |
Entity Framework クエリ最適化 WITH(NOLOCK)
https://www.itsvse.com/thread-9513-1-1.html
免責事項:
Code Farmer Networkが発行するすべてのソフトウェア、プログラミング資料、記事は学習および研究目的のみを目的としています。 上記の内容は商業的または違法な目的で使用されてはならず、そうでなければ利用者はすべての結果を負うことになります。 このサイトの情報はインターネットからのものであり、著作権紛争はこのサイトとは関係ありません。 ダウンロード後24時間以内に上記の内容を完全にパソコンから削除してください。 もしこのプログラムを気に入ったら、正規のソフトウェアを支持し、登録を購入し、より良い本物のサービスを受けてください。 もし侵害があれば、メールでご連絡ください。

Mail To:help@itsvse.com