デッドロックエラーがデッドロックSQLを返していません


13

Transaction (Process ID) was deadlocked on lock resources with another process and has been chosen as the deadlock victim. Rerun the transaction.

Webサイトの1つがビジーになると、このエラーがランダムに発生します。どのテーブルのセットが起こっているかは大体わかっていますが、他のプログラムでの経験では、通常、デッドロックが起こっている場所でSQLが返されます。これを可能にするためにオンにする必要があるフラグはありますか?

これは今のところ私の主な質問なので、デッドロック自体を別の問題としてデバッグしてみます。

SQL Server 2008 Standard Editionを使用しています。


サービスを再起動できますか?サービスをバウンスできる場合は、トレースフラグ1204をスタートアップパラメーターに追加して、デッドロックの詳細をSQL Serverログに記録できます。> 1204:デッドロックに参加しているリソースとロックのタイプ、および影響を受ける現在のコマンドを返します。>>範囲:唯一のグローバル
TEVO D

1
構成マネージャーを使用します。[SQL Serverサービス]で、右クリックしてプロパティを開きます。[詳細設定]タブの起動パラメーターに移動します。マスターデータベースファイルなどの場所のエントリがあります。;-T1204サービスを終了して再開するには、トレースフラグを追加します。
テボD

4
サービスを再起動する理由 DBCC TRACEON(1204、-1)
Mark Storey-Smith

msdn.microsoft.com/en-us/library/ms188396.aspxから:動作の変更:SQL Server 2000では、エラーログへのデッドロックレポートを有効にするには、単純なDBCC TRACEON(1204)で十分です。SQL Server 2008では、セッションレベルのフラグはデッドロックモニタースレッドに表示されないため、フラグをグローバルに有効にする必要があります。
テボD

2
@TevoD- グローバル-1DBCC TRACEON示すパラメーター。
マーティンスミス

回答:


25

必要なデータは、デフォルトの拡張イベントトレースに記録されます。

DECLARE @xml XML

SELECT @xml = target_data
FROM   sys.dm_xe_session_targets
       JOIN sys.dm_xe_sessions
         ON event_session_address = address
WHERE  name = 'system_health'
       AND target_name = 'ring_buffer'

SELECT   
             XEventData.XEvent.query('(data/value/deadlock)[1]')  AS DeadlockGraph,
             CAST(XEventData.XEvent.value('(data/value)[1]', 'varchar(max)') AS XML) AS DeadlockGraph,
              XEventData.XEvent.value('(./@timestamp)[1]', 'DATETIME2') AS [DateTime]
FROM   (SELECT @xml AS TargetData) AS Data
       CROSS APPLY 
       TargetData.nodes ('RingBufferTarget/event[@name="xml_deadlock_report"]') AS XEventData (XEvent) 
ORDER BY [DateTime] DESC

ただし、サービスを再起動した場合(トレースフラグを適用する場合、またはバッファがその間に循環した場合など)はもう存在しません。

永続的な不揮発性ストレージのファイルターゲットにデッドロックグラフを保存する独自の拡張イベントトレースを設定できます。サンプルコードはこちら。個人的に、デッドロックグラフのXMLはトレースフラグの出力よりも使いやすいと感じています。

編集

  1. @MartinCは、すべての更新が含まれていないSQL Serverのインスタンスでは、無効なXMLの生成に問題がある可能性があるとコメントで指摘しています。そのための修正は、ここで説明されているようCAST(REPLACE(REPLACE(XEventData.XEvent.value('(data/value)[1]', 'varchar(max)'), '<victim-list>', '<deadlock><victim-list>'), '<process-list>', '</victim-list><process-list>') AS XML) AS DeadlockGraphに、いくつかの検索と置換を行い、SELECTリストで使用することです
  2. ウェインシェフィールドは、デッドロックグラフXMLを表形式に細断するための便利なスクリプトをここに投稿しました

悲しいことに、EEは、すべてのデッドロックをキャプチャし、バグのようですいません:connect.microsoft.com/SQLServer/feedback/details/754115/...
マット

3

受け入れられた答えは私には一貫して機能しませんでした。リングバッファは、特定の状況でイベントをドロップすることがわかっているようです。

ConnectItem

リングバッファの問題

system_healthログイベントファイルは解析できます(この回答から)。

with XmlDeadlockReports as
(
  select convert(xml, event_data) as EventData
  from sys.fn_xe_file_target_read_file(N'system_health*.xel', NULL, NULL, NULL)
  where substring(event_data, 1, 50) like '%"xml_deadlock_report"%'  
) 
select EventData.value('(event/@timestamp)[1]', 'datetime2(7)') as TimeStamp,
       EventData.query('event/data/value/deadlock') as XdlFile
  from XmlDeadlockReports
 order by TimeStamp desc

XdlFileフィールドは.xdlファイルに保存し、SSMSに読み込むことができます。SQL Server 2012でテスト済み。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.