1

次のシナリオが考えられます。selectステートメントがSqlServerManagement Studio(2005、2008)から実行され、大きな結果セットが取得されます。これは、コンテキストメニューから[上位200行の編集]を選択しても実行されません。

DBAによると、これにより、クエリ対象のテーブルがロックされる可能性があります。ロック解除は、クエリ結果が閉じられたときに発生します。

これが真実であることを確認するドキュメントが見つかりません。それで、事実かフィクションか?

編集:
アーロンの答えを選択し、有用な答えを求めてユーリとロイドに親指を立てます。

よろしく、

ミシェル

4

3 に答える 3

2

この記事を読んでみてください。ロックモード

共有ロック


共有(S)ロックにより、同時トランザクションは悲観的な同時実行制御下でリソースを読み取る(SELECT)ことができます。詳細については、同時実行制御のタイプを参照してください。リソースに共有(S)ロックが存在する間、他のトランザクションはデータを変更できません。リソースの共有(S)ロックは、トランザクション分離レベルが反復可能読み取り以上に設定されているか、ロックヒントを使用して共有(S)ロックを保持する場合を除き、読み取り操作が完了するとすぐに解放されます。取引。

于 2012-09-06T12:18:15.663 に答える
2

SELECTは1回実行され、データの読み取りが完了すると、共有ロック(排他ロックではありません!)が解放されます。これは、クライアントに表示されている最後の行と正確に一致する場合がありますが、数ミリ秒前に発生する場合があります。結果がクライアントで開かれているという事実は、SQL Serverでは認識されません(「テーブルを開く」/「上位200行を編集する」について話している場合を除く)。単一のSELECTステートメントでは、説明した方法でテーブルをロックすることはできないと思います。他のリーダーとライターは、テーブルをうまく操作できるはずです、 SELECTが実行されています。

ただし、これをシミュレートする方法は、次の組み合わせを実行することです...

SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
BEGIN TRANSACTION;
SELECT * FROM dbo.table WITH (TABLOCKX);

...そして昼食に行きます。

于 2012-09-06T12:43:03.160 に答える
2

SELECTステートメントはテーブルをロックするため、ステートメントの実行中にテーブルに変更を加えることはできません。他のSELECTステートメントに対してテーブルをロックしません。

SELECTステートメントは、共有ロックを使用して動作します。共有ロックは他の共有ロックと互換性があります。その結果、同じテーブルに対して複数のSELECTステートメントを実行することができます。テーブルに加えられた変更には、排他ロックが必要です。テーブルは、接続に排他ロックを付与する前に、すべての共有ロックが終了するのを待つ必要があります。したがって、テーブルに変更を加えるトランザクションは、テーブル上の他のすべてのトランザクションが終了するまで待機する必要があります。

于 2012-09-06T13:27:14.630 に答える