1. ホーム
  2. sql-server

[解決済み] TABLOCKとTABLOCKXの比較

2022-02-07 13:33:35

質問事項

とはどのような違いがあるのでしょうか? TABLOCKTABLOCKX ?

http://msdn.microsoft.com/en-us/library/ms187373.aspx は次のように述べています。 TABLOCK は共有ロックであるのに対し TABLOCKX は排他ロックです。最初のロックは、もしかしたらインデックス・ロックの一種に過ぎないのでしょうか?また、ロックの共有とはどのような概念なのでしょうか?

解決方法は?

大きな違い TABLOCK は共有ロックを取得しようとします。 TABLOCKX 排他的ロック

トランザクションの中で、テーブルの排他的ロックをつかんだら、EG。

SELECT 1 FROM TABLE WITH (TABLOCKX)

他のプロセスでは掴めない 任意の はテーブルをロックしていることを意味します。 すべて クエリがテーブルにアクセスしようとすると、トランザクションがコミットされるまでブロックされます。

TABLOCK は共有ロックを取得するだけで、共有ロックはトランザクションアイソレーションが READ COMMITTED (デフォルト)です。もしあなたの分離レベル より高い を、例えば SERIALIZABLE 共有ロックは、トランザクションが終了するまで保持されます。


共有ロックは、うーん、共有ですね。つまり、2つのトランザクションがともにテーブルのSまたはISロックを保持している場合、同時にテーブルからデータを読み取ることができます。 TABLOCK ). しかし、もし transaction A はテーブルの共有ロックを保持しています。 transaction B は、すべての共有ロックが解放されるまで排他ロックを取得することができません。どのロックがどのロックと互換性があるかについては、こちらをご覧ください。 msdnにて .


どちらのヒントも、より細かいロック(行やページレベルのロックなど)を回避させる。原理的には、より詳細なロックはより良い同時実行を可能にします。例えば、あるトランザクションがテーブルの100行目を更新し、別のトランザクションが1000行目を更新したとします。 同時に を2つのトランザクションで実行します(ページロックがあると厄介ですが、それは省略します)。

しかし、時には、特定の操作のパフォーマンスを向上させ、デッドロックの可能性を排除するために、データベースとの同時実行を減らしたい場合があります。

一般的には TABLOCK または TABLOCKX ただし、エッジケースでどうしても必要な場合は別です。