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

SELECTクエリでのSQLServerLOCKSについて

    SELECT SQLServerでは共有ロックを配置します テーブルの行-および2番目のSELECT また、共有ロックが必要であり、それらは相互に互換性があります。

    したがって、1つのSELECT 別のSELECTをブロックできません 。

    WITH (NOLOCK) クエリヒントは、(別の接続によって)挿入されている途中で、まだコミットされていないデータを読み取れるようにするために使用されます。

    そのクエリヒントがない場合、SELECT 進行中のINSERTによってテーブルの読み取りがブロックされる可能性があります (またはUPDATE排他的を配置するステートメント その操作のトランザクションがコミットされる(またはロールバックされる)まで、行(または場合によってはテーブル全体)をロックします。

    WITH (NOLOCK)の問題 ヒントは次のとおりです。最後に、まったく挿入されないデータ行を読み取っている可能性があります(INSERTの場合) トランザクションはロールバックされます)-つまり、レポートには、データベースに実際にコミットされたことのないデータが表示される場合があります。

    役立つ可能性のある別のクエリヒントがあります-WITH (READPAST) 。これはSELECTに指示します 読み込もうとし、排他的にロックされている行をスキップするコマンド。 SELECT ブロックせず、「ダーティ」なコミットされていないデータを読み取りませんが、一部の行をスキップする可能性があります。テーブル内のすべての行を表示するわけではありません。



    1. MariaDBAXを使用した分析-tTheOpenSource Columnar Datastore

    2. SQLServerの論理演算子ではないもの-SQLServer/TSQLチュートリアルパート121

    3. Postgres配列にNULLが存在するかどうかを確認します

    4. Postgresqlで同等のテーブル値パラメーター