3

私のクエリが次のようになっている場合:

DELETE a
FROM TableA AS a
JOIN TableB as b
ON a.SomeColumn = b.SomeColumn

TableBからすべてのレコードを削除するのにかかる時間ロックされているかTableAどうか?そうである場合、それはテーブルレベル、ページレベル、または行レベルのロックですか?

私はSQLServer2008 R2を使用していますが、SQL Serverが一般的にロックをいつどのように使用するかについての適切な情報を見つけるのに苦労しているので、それに関連するリソースをいただければ幸いです。

4

1 に答える 1

3

ほとんどの場合、共有ロックはに発行されます。TableBこれは、を実行した場合と同じタイプのロックですSELECT。ただし、取得するロックの特定のタイプ、およびロックの期間は個々のシナリオによって異なるため、次の検証を実行して、質問に対する正確な回答を取得する必要があります。

まず、SET TRANSACTION ISOLATION LEVEL REPEATABLE READ。これにより、トランザクションが完了するまで共有ロックが保持されます。これは、読み取り中の読み取り中にのみ保持されるのではありませんREAD COMMITTED

後でどのロックが発行されたかを調べることができるように、分離レベルを上げています...しかし、このため、本番システムでこのテストを実行することはおそらく望ましくありません

次に、BEGIN TRANSACTION

次に、問題のDELETEコマンドを発行します。

ここで、を確認しsys.dm_tran_locksます。SELECTこの回答では、@MartinSmithによって提供されたステートメントを使用することを強くお勧めします。

最後に、COMMITまたはROLLBACKトランザクションを閉じてロックを解除します。

SELECT使用の結果は、sys.dm_tran_locks取得されたロックのタイプ、およびそれらが取得されたオブジェクトの詳細を示します。

于 2013-02-13T23:46:56.220 に答える