行が読み取られないようにロックするのはおそらく少し珍しいことだと思いますが、この場合は関係があります。SQL Server 2005 の行レベルのロックでは、読み取りと書き込みの両方に対して行をロックするにはどうすればよいでしょうか? ありがとう!
1 に答える
簡単に言えば、それはできません。
ページ ロックを使用して、行に対する読み取りを防止するための "ベスト ショット" の努力を行うことができます (同時実行性にかなりの悪影響を与えます)。
SELECT ... WITH (PAGLOK,XLOCK)
ページの排他ロックを取得できる場合、他のセッションからのそのページからの読み取りは効果的にブロックされます。ただし、注意: クラスター化インデックスのページで排他ロックを取得しても、リーダーは非クラスター化インデックスから行の値を読み取ることができます。したがって、すべての読み取りを実際に防止しているわけではありません。
セッションとクエリは排他的な行ロックを簡単に回避できるため、(テーブルやページのロックではなく) 排他的な行ロックは、基本的にブロック リーダーには役に立ちません。(セッションはトランザクション分離レベルでロックを回避でき、クエリはWITH (NOLOCK)
ヒントを使用してロックを回避できます。)
SQL Server のロックはかなり複雑な問題なので、ここでは掘り下げません。
REAL の質問 (RThomas がコメントで強調しているのは、行の読み取りを防ぐ必要がある理由を理解することです。理由が何であれ、排他的な行 (またはページ) ロックを取得することが最善ではないことが判明する可能性があります (または右) 解決しようとしている問題の解決策。