ブロックされたセッションの詳細を追跡する方法を理解/学習しようとしています。
そこで、次のセットアップを作成しました。
create table foo (id integer not null primary key, some_data varchar(20));
insert into foo values (1, 'foo');
commit;
次に、2つの異なるクライアントからデータベースに2回接続します。
最初のセッションの問題:
begin transaction
update foo set some_data = 'update'
where id = 1;
ロックを保持するために、明示的にコミットしません。
2番目のセッションでは、同じステートメントを発行します。もちろん、ロックのために待機します。セッション2がfoo
テーブルを待機していることを確認するために、さまざまなクエリを使用しようとしています。
sp_who2
以下を示します(重要な情報のみを表示するためにいくつかの列を削除しました)。
SPID | ステータス| BlkBy | DBName | コマンド| SPID | リクエストID ----- + -------------- + ------- + ---------- + ---------- -------- + ------ + ---------- 52 | 寝る| 。| foodb | 待機中のコマンド| 52 | 0 53 | 寝る| 。| foodb | 待機中のコマンド| 53 | 0 54 | 一時停止| 52 | foodb | 更新| 54 | 0 56 | 実行可能| 。| foodb | SELECT INTO | 56 | 0
これは予想されることであり、セッション54はセッション52からのコミットされていない変更によってブロックされます。
クエリsys.dm_os_waiting_tasks
もこれを示しています。声明:
select session_id, wait_type, resource_address, resource_description
from sys.dm_os_waiting_tasks
where blocking_session_id is not null;
戻り値:
session_id | wait_type | resource_address | resource_description ----------- + ----------- + -------------------- + ----- -------------------------------------------------- -------------------------- 54 | LCK_M_X | 0x000000002a35cd40 | keylock hobtid = 72057594046054400 dbid = 6 id = lock4ed1dd780 mode = X relatedObjectId = 72057594046054400
再びこれが予想されます。
私の問題は、セッション54が待機している実際のオブジェクト名を見つける方法がわからないことです。
私は次のような参加sys.dm_tran_locks
しているクエリをいくつか見つけましたsys.dm_os_waiting_tasks
:
SELECT ....
FROM sys.dm_tran_locks AS l
JOIN sys.dm_os_waiting_tasks AS wt ON wt.resource_address = l.lock_owner_address
しかし、上記のテストシナリオでは、この結合は何も返しません。そのため、その結合が間違っているかdm_tran_locks
、実際に探している情報が含まれていません。
したがって、私が探しているのは、
「セッション54はテーブルのロックを待機していますfoo
」のようなものを返すクエリです。
いくつかの背景情報:
私が解決しようとしている現実の問題はもう少し複雑ですが、「どのテーブルでセッション54が待機しているのか」という質問に要約されます。問題の問題には、複数のテーブルを更新する大規模なストアドプロシージャと、それらのテーブルの一部にアクセスするビューからの選択が関係しています。select
声明は、私たちがスナップショット分離を持っていると、コミットのスナップショットが有効になって読んでいてもブロックされています。選択がブロックされる理由を理解する(スナップショット分離が有効になっている場合は不可能だと思った)ことが次のステップになります。
最初のステップとして、そのセッションが何を待っているかを知りたいです。