ランダムに見える問題をトラブルシューティングしています
問題は、アプリケーション(ダイナミクスSL)がフリーズすることがある
アプリケーションがフリーズしているときに、SQLアクティビティモニターでブロックされているものとヘッドブロッカーがあることに気付きました
私の限られた理解では、ヘッドブロッカーは、セッションが現在実行中でリソースをロックしており、そのリソースが別のセッションでも必要であることを意味します。そのため、そのリソースへのアクセスを必要とするすべてのセッションは続行できないため、アクティビティモニターに表示される「ブロック」
私の質問は、ヘッドブロッカーのタスクステータスが実際には空白であるという5つのケースで見たものです。通常、タスクのステータスは「実行中」または「一時停止」ですが、実行していないセッションをヘッドブロッカーにするにはどうすればよいでしょうか。
頭のブロッカーの理解が間違っているのではないかと思っています。しかし、私にELI5スタイルを啓発してください:)
5つのケースのそれぞれ。ヘッドブロッカーの工程を殺すだけです。その後、誰ももう凍っていません。
このヘッドブロッカーの原因を特定して解決策を考えたい
ヘッドブロッカーの詳細をクリックすると。私が見るすべては
select @@identity
お知らせ下さい?
ありがとうございました
実際には、セッションをブロックするためには、他の何かが望むリソースへのロックを保持する必要があります。実際には何もする必要はありません。たとえば、次を実行すると
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列の情報を使用して個人を追跡できることがよくあります。