予想通り
- <リ>
ORDER BY を使用し、ROWLOCK を使用せず、インデックスを使用しない SELECT では、TOP 2 を解決するためのスキャン/中間ソートが行われるため、テーブルがロックされます。したがって、2 番目のセッションでは、READPAST のためにテーブル全体がスキップされます
<リ>ORDER BY のない SELECT は、たまたま挿入順になっている任意の 2 行を選択するだけです (純粋な偶然、暗黙の順序はありません)。これら 2 行がロックされているという事実により、2 番目のセッションは次のロックされていない行にスキップします。
SQL Server はロックを可能な限り細かく維持しようとしますが、スキャンはテーブル ロックを意味します。さて、これは通常違いはありません (共有読み取りロックになります) が、排他的にロックされたテーブルを意味する UPDLOCK も持っています
したがって、これらの両方が必要です
- SELECT クエリ (ROWLOCK、UPDLOCK、READPAST) の 3 つのヒントで、粒度、分離、同時実行性を制御します。
ROWLOCK のみを使用すると、すべての行で排他ロックがスキャン/ソートされます。 Value
のインデックス INCLUDETestID
SELECT を効率的にします。インデックスのみで同時実行性はおそらく修正されますが、保証はされません。
以前の質問の 1 つで、 SQL Server プロセス キューの競合状態 3 つのロックのヒントがすべてあります