大きな違い、TABLOCK
「共有」ロックを取得しようとし、TABLOCKX
排他的ロック。
トランザクション中にテーブルの排他ロックを取得する場合、EG:
SELECT 1 FROM TABLE WITH (TABLOCKX)
他のプロセスはいずれかを取得できません テーブルをロックします。つまり、すべて テーブルと通信しようとするクエリは、トランザクションがコミットされるまでブロックされます。
TABLOCK
共有ロックを取得するだけです。トランザクション分離がREAD COMMITTED
の場合、ステートメントの実行後に共有ロックが解放されます。 (デフォルト)。分離レベルが高い場合、例:SERIALIZABLE
、共有ロックはトランザクションが終了するまで保持されます。
共有ロックは、うーん、共有されています。つまり、2つのトランザクションが両方ともテーブルに対してSまたはISロックを保持している場合(TABLOCK
を介して)、両方が同時にテーブルからデータを読み取ることができます。 )。ただし、transaction A
テーブルの共有ロックを保持しているtransaction B
すべての共有ロックが解放されるまで、排他ロックを取得することはできません。 msdnでどのロックがどのロックと互換性があるかについて読んでください。
両方のヒントにより、dbはより詳細なロック(行またはページレベルのロックなど)の取得をバイパスします。原則として、よりきめ細かいロックにより、同時実行性が向上します。したがって、たとえば、あるトランザクションがテーブルの行100を更新し、別の行1000を同時に更新する場合があります。 2つのトランザクションから(ページロックでは注意が必要ですが、スキップできます)。
一般に、きめ細かいロックが必要ですが、データベースの同時実行性を減らして特定の操作のパフォーマンスを向上させ、デッドロックの可能性を排除したい場合もあります。
通常、TABLOCK
は使用しません またはTABLOCKX
エッジケースで絶対に必要な場合を除いて。