Deadlock error tidak mengembalikan SQL kebuntuan

13

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

Saya mendapatkan kesalahan ini secara acak ketika salah satu situs web saya sibuk. Saya tahu kira-kira set tabel mana yang sedang terjadi tetapi dalam pengalaman saya dengan program lain saya biasanya mendapatkan SQL kembali di mana kebuntuan terjadi. Apakah ada bendera yang harus saya nyalakan untuk memungkinkan ini terjadi?

Saya akan mencoba dan debug kebuntuan itu sendiri sebagai masalah yang terpisah karena ini adalah pertanyaan utama saya untuk saat ini.

Saya menggunakan SQL Server 2008 Edisi Standar.

webnoob
sumber
Apakah Anda dapat memulai ulang layanan? Jika Anda dapat memantulkan layanan, Anda dapat menambahkan tanda tambah jejak 1204 ke parameter startup Anda untuk mencatat rincian kebuntuan ke log SQL Server. > 1204: Mengembalikan sumber daya dan jenis kunci yang berpartisipasi dalam kebuntuan dan juga perintah saat ini terpengaruh. >> Lingkup: hanya global
Tevo D
1
Gunakan manajer konfigurasi. Di bawah Layanan SQL Server, klik kanan dan buka properti. Pergi ke tab Advanced, parameter startup. Anda akan memiliki entri untuk lokasi file database master dan semacamnya. Tambahkan ;-T1204untuk tanda jejak untuk mengakhiri dan memulai kembali layanan.
Tevo D
4
Mengapa memulai kembali layanan ini? DBCC TRACEON (1204, -1)
Mark Storey-Smith
Dari msdn.microsoft.com/en-us/library/ms188396.aspx : Perubahan Perilaku: Dalam SQL Server 2000, DBCC TRACEON sederhana (1204) sudah cukup untuk memungkinkan pelaporan kebuntuan ke log kesalahan. Di SQL Server 2008, Anda harus mengaktifkan bendera secara global karena bendera tingkat sesi tidak terlihat oleh utas kebuntuan monitor.
Tevo D
2
@TevoD - -1Parameter yang DBCC TRACEONmenandakan global.
Martin Smith

Jawaban:

25

Data yang Anda butuhkan dicatat dalam jejak peristiwa diperpanjang standar.

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

Meskipun itu tidak akan ada lagi jika Anda telah me-restart layanan -eg untuk menerapkan tanda jejak atau jika buffer telah bersepeda sementara itu.

Anda dapat mengatur jejak peristiwa diperpanjang Anda sendiri yang menyimpan grafik kebuntuan ke target file untuk penyimpanan non-volatile persisten. Contoh Kode di sini . Saya pribadi menemukan grafik kebuntuan XML lebih ramah daripada keluaran flag trace.

Edit

  1. @ MartinC menunjukkan dalam komentar bahwa pada contoh SQL Server yang tidak memiliki semua pembaruan mungkin ada masalah dengan itu menghasilkan XML yang tidak valid. Cara mengatasinya adalah dengan melakukan pencarian dan mengganti serta menggunakan 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 DeadlockGraphdalam SELECTdaftar seperti yang dijelaskan di sini .
  2. Wayne Sheffield telah memposting skrip yang berguna untuk memecah kebuntuan grafik XML ke dalam format tabel di sini .
Martin Smith
sumber
Sayangnya, EE tidak menangkap semua deadlock dan tampaknya menjadi bug: connect.microsoft.com/SQLServer/feedback/details/754115/…
Matt
3

Jawaban yang diterima tidak bekerja untuk saya secara konsisten. Buffer cincin tampaknya diketahui dapat menjatuhkan peristiwa dalam kondisi tertentu ..

ConnectItem

Masalah Ring Buffer

File event log system_health dapat diuraikan (dari jawaban ini ):

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

Kolom XdlFile dapat disimpan ke file .xdl dan membaca SSMS. Diuji dalam Sql Server 2012.

crokusek
sumber