2009-05-07 7 views
7

मेरे पास मेरे आवेदन से एक SQL कथन है। मैं जानना चाहता हूं कि कौन सा तालाब बयान प्राप्त करता है; मैं SQL सर्वर के साथ ऐसा कैसे कर सकता हूं? कथन एक डेडलॉक में शामिल किया गया है, जिसे मैं विश्लेषण करने की कोशिश कर रहा हूं; मैं डेडलॉक को पुन: उत्पन्न नहीं कर सकता। मैं एमएस एसक्यूएल सर्वर 2005 पर चल रहा हूं।एसक्यूएल सर्वर पर एक प्रश्न में अधिग्रहण किए गए कौन से ताले ढूंढ रहे हैं?

उत्तर

3

मैं सुझाव दूंगा कि आप प्रोफेसर ट्रेस को अनिश्चित काल तक चलाने के बजाय पहले उदाहरण में डेडलॉक डिटेक्शन ट्रेस ध्वज चालू करें।

इस तरह, ईवेंट विवरण SQL सर्वर त्रुटि लॉग में लॉग किया जाएगा।

विभिन्न ट्रेस ध्वज के विवरण के लिए निम्नलिखित पुस्तकें ऑनलाइन संदर्भ की समीक्षा करें। आप 1204 और/या 1222

http://msdn.microsoft.com/en-us/library/ms188396(SQL.90).aspx

उपयोग करने के लिए सर्वर गुंजाइश के साथ ट्रेस ध्वज सक्षम करना सुनिश्चित करें और न सिर्फ मौजूदा सत्र की जरूरत है। उदाहरण के उपयोग के लिए:

DBCC TRACEON(1222,-1) 
+0

दिलचस्प, मैं झंडे कैसे सेट कर सकता हूं? एक प्रश्न विश्लेषक में? कोई ओवरहेड यहां शामिल है? – Tomas

+0

मैं दोनों "डीबीसीसी ट्रेसीन (1222, -1)" और "डीबीसीसी ट्रेसीन (1204, -1)" चलाया और एक डेडलॉक ग्राफ़ ट्रेस (एसक्यूएल सर्वर 2005 पर) शुरू किया। जब मैंने डेडलॉक को मजबूर कर दिया, तो ट्रेस ने इसे पकड़ लिया। हालांकि SQL सर्वर त्रुटि लॉग के भीतर डेडलॉक का कोई रिकॉर्ड नहीं है। मैं SQL सर्वर प्रबंधन स्टूडियो में "SQL सर्वर एजेंट" + "त्रुटि लॉग" + "वर्तमान -" + में राइट क्लिक कर रहा हूं + "एजेंट लॉग देखें" मैं गलत क्या कर सकता हूं? –

+0

आप गलत लॉग देख रहे हैं, वे एजेंट लॉग हैं। प्रबंधन> एसक्यूएल सर्वर लॉग – Sam

2

प्रोफाइलर में एक निशान चलाएं (खाली टेम्पलेट चुनें), डेडलॉक ग्राफ़ ईवेंट का चयन करें, और दिखाई देने वाले नए टैब पर (ईवेंट एक्सट्रैक्शन सेटिंग्स), प्रत्येक को सहेजें (अपनी फ़ाइल में अलग से डेडलॉक एक्सएमएल घटनाओं को बचाने के लिए जांचें)। इस फ़ाइल को एक एक्सएमएल व्यूअर में खोलें और यह बताना आसान होगा कि क्या हो रहा है। प्रत्येक प्रक्रिया निहित है, प्रक्रिया कॉल के ढेर के साथ, आदि और सभी ताले भी वहां हैं।

इस ट्रेस को तब तक चलने दें जब तक कि डेडलॉक फिर से न हो जाए, जानकारी केवल तभी दर्ज की जाती है जब डेडलॉक होता है, इसलिए ज्यादा ओवरहेड नहीं होता है। यदि यह फिर कभी नहीं होता है, तो अच्छा हल हो जाता है, अगर आपने सभी जानकारी पर कब्जा नहीं किया है।

+0

लेकिन कर रही है कि मैं परिदृश्य से बनाना होगा ट्रेस चलाते समय के लिए? मैं परिदृश्य को पुन: उत्पन्न नहीं कर सकता। – Tomas

+0

उस ट्रेस को चलाने का ओवरहेड क्या है? – Tomas

+0

इस ट्रेस को उत्पादन में चलाएं, या जहां भी यह हो रहा है। यदि आप फिर से डेडलॉक कभी नहीं देखते हैं, तो कुछ भी अच्छा नहीं है। यदि आप इसे देखते हैं, तो यह रिकॉर्ड होगा कि क्या हुआ और फिर आप यह पता लगा सकते हैं कि क्या हो रहा है। –

4

आप किसी लेनदेन में बयान चला सकते हैं, लेकिन लेन-देन के लिए प्रतिबद्ध नहीं। चूंकि लेन-देन पूरा होने तक ताले लगाए जाएंगे, यह आपको ताले का निरीक्षण करने का समय देता है। (नहीं अनिश्चित काल के लिए है, लेकिन जैसे 5 मिनट डिफ़ॉल्ट रूप से।)

तरह:

BEGIN TRANSACTION 
select * from table 

तो ताले जाँच प्रबंधन स्टूडियो खोलने के लिए और। वे प्रबंधन में हैं -> गतिविधि मॉनिटर -> प्रक्रिया द्वारा ऑब्जेक्ट या ताले द्वारा ताले। पूरा करने के बाद, चलाएं:

COMMIT TRANSACTION 

ताले मुक्त करने के लिए।

0

आप प्रश्नों के लिए अपने देव बॉक्स पर एक प्रोफाइलर ट्रेस चला सकते हैं और देख सकते हैं कि ताले क्या हैं। यह आमतौर पर डेटा की एक बड़ी मात्रा है, लेकिन इसमें से अधिकतर पैटर्न होंगे जिन पर आप स्किम कर सकते हैं। जैसे पढ़ने के अलगाव के लिए, आप लॉक का उत्तराधिकार प्राप्त करेंगे और एक टेबल या इंडेक्स स्कैन करते समय जारी किए जाएंगे (प्रत्येक पंक्ति को पढ़ने से पहले लॉक किया जाना चाहिए, और इसे पढ़ने के तुरंत बाद इसे जारी किया जाना चाहिए)।

आप किस अलगाव के तहत चलते हैं? किस प्रकार के प्रश्न डेडलॉकिंग कर रहे हैं? क्या आप स्पष्ट लेनदेन का उपयोग कर रहे हैं जिसमें एकाधिक अपडेट शामिल हैं, या वे एकल कथन डेडलॉकिंग हैं?

डेडलॉक के लिए सबसे आम मामला अनुक्रम (अद्यतन तालिका एक्स, अद्यतन तालिका वाई) के साथ एक लेनदेन है, और अनुक्रम (अद्यतन तालिका वाई, अद्यतन तालिका एक्स) के साथ एक दूसरा लेनदेन है। सामान्य समाधान यह सुनिश्चित करना है कि आप क्वेरी में एक ही अद्यतन अनुक्रम का उपयोग करें।

हमें बताएं कि वे किस तरह के प्रश्न हैं, विभिन्न प्रकार के लेनदेन के लिए विभिन्न आम मुद्दे हैं।

3

यहां एक प्रश्न है जो आपको सभी सक्रिय ताले दिखाएगा, उन्हें कौन मिला है, और वे किस वस्तु पर हैं। मैंने इसे एक तकनीकी लेख या कुछ साल और साल पहले खींच लिया था। यह एसक्यूएल 2000 और 2005 (2005 के लिए sys.objects में sysobjects को बदलें) पर काम करता है। यदि आप इसे केवल इस डेटाबेस तक सीमित करना चाहते हैं, और केवल "विशिष्ट" ताले को WHERE खंड को अनमोलमेंट करें।

select 'Locks' as Locks, 
    spid, nt_username, name, hostname, loginame, waittime, open_tran, 
    convert(varchar ,getdate() - last_batch, 114) as TimeSinceLastCommand, 
    case req_mode 
    when 0 then 'Not granted' 
    when 1 then 'Schema stability' 
    when 2 then 'Schema modification' 
    when 3 then 'Intent shared' 
    when 4 then 'Shared intent update' 
    when 5 then 'Intent shared shared' 
    when 6 then 'Intent exclusive' 
    when 7 then 'Shared Intent Exclusive' 
    when 8 then 'Shared' 
    when 9 then 'Update' 
    when 10 then 'Intent insert NULL' 
    when 11 then 'Intent shared exclusive' 
    when 12 then 'Intent update' 
    when 13 then 'Intent shared-update' 
    when 14 then 'Exclusive' 
    when 15 then 'Bulk operation' 
    else str(req_mode) end as LockMode 
from master..syslockinfo 
    left join sysobjects so on so.id = rsc_objid 
    left join master..sysprocesses sp on sp.spid = req_spid 
--where rsc_dbid = (select db_id()) and ltrim(req_mode) in (6,7,11,14) 
+0

छोटी टिप्पणी: SQL 2012 के लिए संख्याएं थोड़ी अलग हैं: http://technet.microsoft.com/en-us/library/ms189497.aspx – n0rd

संबंधित मुद्दे