डेडलॉक त्रुटि डेडलॉक एसक्यूएल वापस नहीं कर रहा है


13

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

जब मेरी कोई वेबसाइट व्यस्त हो जाती है तो मुझे यह त्रुटि अनियमित रूप से मिल रही है। मैं मोटे तौर पर जानता हूं कि यह किस तालिकाओं के सेट पर हो रहा है लेकिन अन्य कार्यक्रमों के साथ मेरे अनुभव में मुझे आमतौर पर एसक्यूएल वापस मिल जाता है जहां गतिरोध हो रहा है। क्या ऐसा कोई झंडा है जिसे मुझे ऐसा करने की अनुमति देनी चाहिए?

मैं कोशिश करूंगा और गतिरोध को एक अलग मुद्दे के रूप में बहस करूं क्योंकि यह अब के लिए मेरा मुख्य सवाल है।

मैं SQL Server 2008 मानक संस्करण का उपयोग कर रहा हूं।


क्या आप सेवा को पुनः आरंभ करने में सक्षम हैं? यदि आप सेवा को बाउंस करने में सक्षम हैं, तो आप SQL सर्वर लॉग के गतिरोध का विवरण लॉग करने के लिए अपने स्टार्टअप पैरामीटर में ट्रेस ध्वज 1204 जोड़ सकते हैं। > 1204: एक गतिरोध में भाग लेने वाले संसाधनों और प्रकार के ताले लौटाता है और वर्तमान कमांड भी प्रभावित होता है। >> स्कोप: वैश्विक केवल
Tevo D

1
कॉन्फ़िगरेशन प्रबंधक का उपयोग करें। SQL सर्वर सेवा के अंतर्गत, राइट क्लिक और खुले गुण। उन्नत टैब पर जाएं, स्टार्टअप पैरामीटर। आपके पास मास्टर डेटाबेस फ़ाइलों और इस तरह के स्थान के लिए प्रविष्टियाँ होंगी। ;-T1204सेवा को समाप्त करने और पुनरारंभ करने के लिए ट्रेस ध्वज के लिए जोड़ें ।
तेजो डी

4
सेवा को फिर से क्यों शुरू करें? DBCC TRACEON (1204, -1)
मार्क स्टोरी-स्मिथ

से msdn.microsoft.com/en-us/library/ms188396.aspx : व्यवहार परिवर्तन: में एसक्यूएल सर्वर 2000, एक सरल DBCC TRACEON (1204) त्रुटि लॉग करने के लिए गतिरोध रिपोर्टिंग सक्षम करने के लिए पर्याप्त है। SQL Server 2008 में, आपको ध्वज को वैश्विक रूप से सक्षम करना होगा क्योंकि सत्र-स्तरीय ध्वज गतिरोध मॉनिटर थ्रेड के लिए दिखाई नहीं देता है।
तेवो डी

2
@TevoD - वैश्विक संकेत -1करने के लिए पैरामीटर DBCC 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

हालाँकि यह कोई और नहीं होगा यदि आपने ट्रेस फ़्लैग लागू करने के लिए सेवा को फिर से शुरू किया है या यदि इस बीच बफर को साइकल किया है।

आप अपने स्वयं के विस्तारित ईवेंट ट्रेस सेट कर सकते हैं जो गतिरोध ग्राफ को लगातार गैर वाष्पशील भंडारण के लिए फ़ाइल लक्ष्य में संग्रहीत करता है। उदाहरण कोड यहाँ । मैं व्यक्तिगत रूप से डेडलॉक ग्राफ एक्सएमएल को ट्रेस फ्लैग आउटपुट की तुलना में अधिक अनुकूल पाता हूं।

संपादित करें

  1. @MartinC उन टिप्पणियों में इंगित करता है जो SQL सर्वर के ऐसे इंस्टेंसेस पर होती हैं, जिनमें सभी अपडेट नहीं होते हैं, जिससे समस्या हो सकती है कि अमान्य 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. वेन शेफील्ड ने गतिरोध ग्राफ एक्सएमएल को सारणीबद्ध स्वरूप में ढालने के लिए एक उपयोगी स्क्रिप्ट पोस्ट की है

अफसोस की बात यह है कि ईई सभी गतिरोधों पर कब्जा नहीं करता है और एक बग लगता है: 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 में परीक्षण किया गया।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.