DB を扱っている時、各 resource がどのように lock されているか、すなわち blocking の状況を把握することが重要です。SQL Server 2005 以降で blocking の状態を調査するには [master].[sys].[dm_tran_locks] を SELECT してやることで取得できます。
まあ、実際には [master].[sys].[dm_tran_locks] だけでは必要な情報が足りない場合が多く、[master].[sys].[dm_exec_sessions] や [master].[sys].[dm_exec_connections] と結合したりしますがこちらについては下記の Figure 3 Capturing locking stats を参考にしてください。
SQL Server のブロッキングを最小限に抑える
[master].[sys].[dm_tran_locks] を SELECT してやることで取得できた lock 情報ですが、このままではわかりずらいのでまずは [resource_associated_entity_id] を object name に変換します。その変換 script が Figure 4 Learning more about blocked data です。環境によっては大文字小文字の統一や @resource_associated_entity_id を bigint に修正してから実行する必要がありますのでご注意を。
で table name が取れたらいよいよ lock されている resource を特定します。これには undocumented な %%lockres%% を利用します。
SELECT * FROM [table name] WHERE %%lockres%% = @resource_description
@resource_description に [master].[sys].[dm_tran_locks] で取得した値を設定して上記 SQL を実行してください。Lock されている行が取得できます。
%%lockres%% は非常に使えるので、ぜひ document に載せて欲しいなぁと思うのですが、過去にその feedback をされていた方がいました。
Make %%lockres%% a documented feature
結果は検証する時間が無いので行わないとのことです。残念です。