私が経験しているいくつかのブロッキングを追跡するのに本当に苦労しています。
ルートブロックSPIDのステータスは「sleeping」、cmdは「AWAITING COMMAND」、およびはsqltext
ですSET TRANSACTION ISOLATION LEVEL READ COMMITTED
。
[ブロックされたトランザクション数別の上位トランザクション]レポートを表示すると、ブロックSQLステートメントは「-」です。
SQLでトレースを実行し、ルートブロッキングSPIDをトレースしてブロッキングが発生した場合、実際にはどこにも導かれていません。最後のtraceステートメントは同じであるsqltext
以上SET TRANSACTION ISOLATION LEVEL READ COMMITTED
。
関連するすべてのストアドプロシージャをチェックして、それらにTRY / CATCH BEGIN TRAN / COMMIT TRAN / ROLLBACK TRANステートメントがあることを確認しました(すべてにストアドプロシージャを使用しているため、スタンドアロンのステートメントは実行されません)。この問題は過去24時間に発生し始めたばかりで、システムに変更を加えたと主張する人はいません。
解決策:めったに使用されないストアドプロシージャの1つに挿入のエラーがありました(列の数が一致しませんでした)が、正確に何が起こっているのかまだ混乱しています。
すべてのトレース情報を確認すると、このストアドプロシージャのEXECステートメントが時々リストされましたが、ブロックするSPIDでBLOCKが発生する直前には決してありませんでした。ブロックを開始すると、トレースはその実行(またはその中のステートメントのいずれか)を記録しなかったようです。ただし、トレースがその実行を記録し、ブロッキングが発生しなかった場合もあります。
ストアドプロシージャのエラーレポートはユーザーから送信されたものであり、トレースで複数のEXECステートメントを見つけてSSMSで実行することができました。それらを実行したとき、ブロッキングが発生したりハングしたりすることはありませんでした。それらは期待通りに実行されました(catchブロックが起動し、エラー後にトランザクションをロールバックしました)。ストアドプロシージャの修正を解決した後、問題は再び発生していません。