web-dev-qa-db-ja.com

セッションがヘッドブロッカーになる理由

ランダムに見える問題をトラブルシューティングしています

問題は、アプリケーション(ダイナミクスSL)がフリーズすることがある

アプリケーションがフリーズしているときに、SQLアクティビティモニターでブロックされているものとヘッドブロッカーがあることに気付きました

私の限られた理解では、ヘッドブロッカーは、セッションが現在実行中でリソースをロックしており、そのリソースが別のセッションでも必要であることを意味します。そのため、そのリソースへのアクセスを必要とするすべてのセッションは続行できないため、アクティビティモニターに表示される「ブロック」

私の質問は、ヘッドブロッカーのタスクステータスが実際には空白であるという5つのケースで見たものです。通常、タスクのステータスは「実行中」または「一時停止」ですが、実行していないセッションをヘッドブロッカーにするにはどうすればよいでしょうか。

頭のブロッカーの理解が間違っているのではないかと思っています。しかし、私にELI5スタイルを啓発してください:)

5つのケースのそれぞれ。ヘッドブロッカーの工程を殺すだけです。その後、誰ももう凍っていません。

このヘッドブロッカーの原因を特定して解決策を考えたい

ヘッドブロッカーの詳細をクリックすると。私が見るすべては

select @@identity

お知らせ下さい?

ありがとうございました

1
BobNoobGuy

実際には、セッションをブロックするためには、他の何かが望むリソースへのロックを保持する必要があります。実際には何もする必要はありません。たとえば、次を実行すると

BEGIN TRANSACTION
    UPDATE MyTable SET Col1 = 'ABC'

また、COMMITを実行しないでください。トランザクションを開いたままにします。セッションは何も実行しておらず、実際にはsys.dm_exec_requestsには表示されません。ただし、ロックは引き続き保持され、他のセッションをブロックし続けます。未処理のトランザクションに関する情報はsys.dm_tran_session_transactionsにあります。

次のポイントは、表示されているコマンドです。これがセッションの最後のバッチです。トランザクションを開いていくつかのバッチを実行すると、表示されない以前のコマンドからのロックを保持している可能性があります。

これらの両方について、次のリンクでかなり詳しく説明しました。

トランザクション:誰が何をどこで

sys.dm_exec_sql_textを使用してブロッキングを理解することは時々欠陥があります。

また、最初のリンクには、問題のトランザクションを実行/実行しているユーザーを見つける方法に関する情報があります。ログインが共有ログインまたはSQL IDである場合、sys.dm_exec_sessionsのHost_name列の情報を使用して個人を追跡できることがよくあります。

4
Kenneth Fisher