web-dev-qa-db-ja.com

トランザクションロールバックの追跡

データベースが非常に忙しく、ロールバックするトランザクションを探すように依頼されました。

SQL Server Profilerを使用してTM: Rollback Tran completedイベントを監視しました。これにより、これらのイベントが毎分発生していることが示されていますが、どのトランザクションがどのオブジェクトにロールバックされているかはわかりません。ロールバックの影響、またはロールバックが発生した理由。要するに、それは非常に限られた使用のようです。

たとえば、SQL:StmtStartingを監視してロールバックにコンテキストを提供しようとすると、このビジー環境にノイズが多すぎて、ロールバックの原因となっているステートメントを特定できません。

文も実行してみました

SELECT *
FROM fn_dblog (NULL, NULL)
WHERE Operation = 'LOP_ABORT_XACT';

しかし、これは結果を返しませんでした(SQLプロファイラーによって報告されているロールバックの数を考えると、奇妙に思えます)。

ロールバックしたトランザクションを示すレポートを作成する方法はありますか?

TIA!

6
paulH

これを行うための事前拡張イベントの方法を次に示します。

プロファイラーを対話的に使用する代わりに、 生成に使用 a サーバー側SQLトレース ファイルに書き込みます。少しトレースを実行した後、 query トレースファイルを使用したり、トレースファイルをテーブルにロードしたり、それらをクエリしたりできます。ロールバックがあるセッションを見つけ、そのセッションのすべてのイベントを順番にクエリします。

私はここでそれを行うためのより良い方法ではないかもしれない何かを試してみます、そしておそらくあなたのサーバーにパフォーマンスの影響を与えるでしょうが、それでも私はそれが何よりも良いと思います。 sys.dm_exec_requests dmvには、クエリのステータスがあります。ロールバックすると「ロールバック」を表示します。常にそのDVMを調べて、そのステータスの要求のSQL_handle(および必要に応じて詳細情報)を収集するジョブを作成する場合、それは良い出発点になる可能性があります。

0