sql >> データベース >  >> RDS >> Sqlserver

ORDER BY および WITH(ROWLOCK、UPDLOCK、READPAST)

    予想通り

      <リ>

      ORDER BY を使用し、ROWLOCK を使用せず、インデックスを使用しない SELECT では、TOP 2 を解決するためのスキャン/中間ソートが行われるため、テーブルがロックされます。したがって、2 番目のセッションでは、READPAST のためにテーブル全体がスキップされます

      <リ>

      ORDER BY のない SELECT は、たまたま挿入順になっている任意の 2 行を選択するだけです (純粋な偶然、暗黙の順序はありません)。これら 2 行がロックされているという事実により、2 番目のセッションは次のロックされていない行にスキップします。

    SQL Server はロックを可能な限り細かく維持しようとしますが、スキャンはテーブル ロックを意味します。さて、これは通常違いはありません (共有読み取りロックになります) が、排他的にロックされたテーブルを意味する UPDLOCK も持っています

    したがって、これらの両方が必要です

    • SELECT クエリ (ROWLOCK、UPDLOCK、READPAST) の 3 つのヒントで、粒度、分離、同時実行性を制御します。
      ROWLOCK のみを使用すると、すべての行で排他ロックがスキャン/ソートされます。
    • Value のインデックス INCLUDE TestID SELECT を効率的にします。インデックスのみで同時実行性はおそらく修正されますが、保証はされません。

    以前の質問の 1 つで、 SQL Server プロセス キューの競合状態 3 つのロックのヒントがすべてあります




    1. SQLServerが一意でないクラスター化インデックスに4バイト整数を追加するのはなぜですか

    2. MySQLdumpをローカルコンピューターに自動化する(Windows)

    3. 単一テーブル継承に参照整合性を適用するにはどうすればよいですか?

    4. ユーザー作成時のmysql構文エラーを修正