ข้อผิดพลาด Deadlock ไม่ส่งคืน SQL deadlock


13

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

ฉันได้รับข้อผิดพลาดนี้แบบสุ่มเมื่อหนึ่งในเว็บไซต์ของฉันไม่ว่าง ฉันรู้คร่าวๆว่ามีชุดของตารางใดบ้าง แต่จากประสบการณ์ของฉันกับโปรแกรมอื่น ๆ ฉันมักจะได้รับ SQL คืนมาเมื่อเกิดการหยุดชะงัก มีธงที่ฉันควรเปิดเพื่อให้สิ่งนี้เกิดขึ้นหรือไม่

ฉันจะลองและดีบักการหยุดชะงักเองเป็นปัญหาที่แยกจากกันเนื่องจากนี่เป็นคำถามหลักของฉันในตอนนี้

ฉันใช้ SQL Server 2008 Standard Edition


คุณสามารถเริ่มบริการได้หรือไม่ หากคุณสามารถตีกลับบริการได้คุณสามารถเพิ่มการเพิ่มค่าสถานะการติดตาม 1204 ลงในพารามิเตอร์เริ่มต้นของคุณเพื่อบันทึกรายละเอียดของการหยุดชะงักในบันทึก SQL Server > 1204: ส่งคืนทรัพยากรและประเภทการล็อคที่เข้าร่วมในการหยุดชะงักและคำสั่งปัจจุบันที่ได้รับผลกระทบ >> ขอบเขต: โกลบอลเท่านั้น
Tevo D

1
ใช้เครื่องมือจัดการการกำหนดค่า ภายใต้บริการเซิร์ฟเวอร์ SQL คลิกขวาและเปิดคุณสมบัติ ไปที่แท็บขั้นสูงพารามิเตอร์การเริ่มต้น คุณจะมีรายการสำหรับตำแหน่งของไฟล์ฐานข้อมูลหลักและอื่น ๆ เพิ่ม;-T1204สำหรับแฟล็กการติดตามเพื่อสิ้นสุดและรีสตาร์ทเซอร์วิส
Tevo D

4
ทำไมต้องเริ่มบริการใหม่ TRACEON DBCC (1204, -1)
Mark Storey-Smith

จากmsdn.microsoft.com/en-us/library/ms188396.aspx : การเปลี่ยนแปลงลักษณะการทำงาน: ใน SQL Server 2000 การสืบค้น DBCC อย่างง่าย (1204) เพียงพอที่จะเปิดใช้งานการรายงาน deadlock ไปยังบันทึกข้อผิดพลาด ใน SQL Server 2008 คุณต้องเปิดใช้งานการตั้งค่าสถานะทั่วโลกเนื่องจากไม่สามารถมองเห็นการตั้งค่าสถานะระดับเซสชันไปยังเธรดการตรวจสอบ deadlock
Tevo D

2
@TevoD - -1พารามิเตอร์ที่DBCC TRACEONบ่งบอกถึงทั่วโลก
Martin Smith

คำตอบ:


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

แม้ว่ามันจะไม่อยู่ที่นั่นอีกต่อไปหากคุณรีสตาร์ทเซอร์วิส -eg เพื่อใช้แฟล็กการติดตามหรือหากบัฟเฟอร์มีการหมุนเวียนในระหว่างนี้

คุณสามารถตั้งค่าการติดตามเหตุการณ์เพิ่มเติมของคุณที่จัดเก็บกราฟเดดล็อกไปยังเป้าหมายไฟล์สำหรับหน่วยเก็บถาวรที่ไม่ลบเลือน ตัวอย่างรหัสที่นี่ ฉันเองพบว่ากราฟกราฟ deadlock 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/…
Matt

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.