2009-03-29 13 views
116

हम कैसे जांच सकते हैं कि कौन से डेटाबेस लॉक लागू होते हैं जिस पर क्वेरी बैच के विरुद्ध पंक्तियां होती हैं?तालिका में कौन से ताले लगाए जाते हैं

कोई भी उपकरण जो वास्तविक समय में तालिका पंक्ति स्तर लॉकिंग को हाइलाइट करता है?

डीबी: SQL सर्वर 2005

उत्तर

94

अन्य प्रतिक्रियाओं को जोड़ने के लिए, sp_lock का उपयोग सभी चल रही प्रक्रियाओं पर पूर्ण लॉक जानकारी को डंप करने के लिए भी किया जा सकता है। आउटपुट भारी हो सकता है, लेकिन यदि आप जानना चाहते हैं कि लॉक क्या है, तो यह चलाने के लिए एक मूल्यवान है। लॉकिंग समस्याओं पर जल्दी से शून्य में मैं आमतौर पर sp_who2 के साथ इसका उपयोग करता हूं।

प्रश्न में SQL सर्वर के संस्करण के आधार पर ऑनलाइन "उपलब्ध" sp_lock प्रक्रियाओं के कई अलग-अलग संस्करण हैं।

आपके मामले में, SQL सर्वर 2005, sp_lock के लिए अभी भी उपलब्ध है, लेकिन बहिष्कृत है, इसलिए अब इस प्रकार की चीज़ के लिए sys.dm_tran_locks देखने का उपयोग करने की अनुशंसा की जाती है। आप एक उदाहरण पा सकते हैं कि "अपना खुद का रोल करें" sp_lock फ़ंक्शन here कैसे करें।

80

यह ठीक आप नहीं दिखा रहा है कौन-सी पंक्तियां बंद कर दिया जाता है, लेकिन यह आप के लिए उपयोगी हो सकता है।

आप देख सकते हैं जो बयान इस चलाकर ब्लॉक किए गए हैं:

select cmd,* from sys.sysprocesses 
where blocked > 0 

यह भी आपको बता देंगे कि प्रत्येक ब्लॉक पर इंतज़ार कर रहा है। तो आप यह देखने के लिए सभी तरह से पता लगा सकते हैं कि किस कथन ने पहले ब्लॉक को अन्य ब्लॉक के कारण बनाया था।

संपादित@MikeBlandford से टिप्पणी जोड़ने के लिए:

अवरुद्ध स्तंभ अवरुद्ध प्रक्रिया का spid इंगित करता है। आप इसे ठीक करने के लिए मार {spid} चला सकते हैं।

+7

अवरुद्ध कॉलम अवरुद्ध प्रक्रिया के स्पिड को इंगित करता है। आप इसे ठीक करने के लिए मार {spid} चला सकते हैं। –

16

आप अंतर्निहित sp_who2 संग्रहीत प्रक्रिया का उपयोग SQL सर्वर आवृत्ति पर वर्तमान अवरुद्ध और अवरुद्ध प्रक्रियाओं को प्राप्त करने के लिए भी कर सकते हैं। आम तौर पर आप एक अवरुद्ध प्रक्रिया को खोजने के लिए एसक्यूएल प्रोफाइलर इंस्टेंस के साथ इसे चलाएंगे और प्रोफाइलर में जारी किए गए सबसे हालिया कमांड को देखेंगे।

28

मैं लॉक किए गए आइटम के ताले के साथ-साथ object_id या partition_id को कैप्चर करने के लिए एक गतिशील प्रबंधन दृश्य (डीएमवी) का उपयोग करता हूं।

SELECT 
    TL.resource_type, 
    TL.resource_database_id, 
    TL.resource_associated_entity_id, 
    TL.request_mode, 
    TL.request_session_id, 
    WT.blocking_session_id, 
    O.name AS [object name], 
    O.type_desc AS [object descr], 
    P.partition_id AS [partition id], 
    P.rows AS [partition/page rows], 
    AU.type_desc AS [index descr], 
    AU.container_id AS [index/page container_id] 
FROM sys.dm_tran_locks AS TL 
INNER JOIN sys.dm_os_waiting_tasks AS WT 
ON TL.lock_owner_address = WT.resource_address 
LEFT OUTER JOIN sys.objects AS O 
ON O.object_id = TL.resource_associated_entity_id 
LEFT OUTER JOIN sys.partitions AS P 
ON P.hobt_id = TL.resource_associated_entity_id 
LEFT OUTER JOIN sys.allocation_units AS AU 
ON AU.allocation_unit_id = TL.resource_associated_entity_id; 
+0

मैं इस कथन का उपयोग करने की कोशिश कर रहा हूं ताकि ऑब्जेक्ट्स की प्रक्रिया की प्रतीक्षा हो। मैं स्पष्ट रूप से 'sp_who2' और 'sys.dm_os_waiting_task' (दोनों एक ही तालिका को अपडेट करने का प्रयास कर रहे हैं) में किसी अन्य के लिए प्रतीक्षा कर रहे एक सत्र को देख सकता हूं। लेकिन आपका बयान किसी भी पंक्ति को वापस नहीं करता है। कोई विचार? –

18

आप क्वेरी का पालन करके अपने तालिका पर वर्तमान ताले पा सकते हैं (डाटाबेस आप object_id प्राप्त करने के लिए निरीक्षण करने के लिए चाहते करने के लिए स्विच करना होगा)।

USE yourdatabase; 
GO 

SELECT * FROM sys.dm_tran_locks 
    WHERE resource_database_id = DB_ID() 
    AND resource_associated_entity_id = OBJECT_ID(N'dbo.yourtablename'); 

sys.dm_tran_locks

देखें तो एक ही request_owner_type के कई उदाहरण मौजूद हैं, request_owner_id स्तंभ प्रत्येक उदाहरण के भेद करने के लिए प्रयोग किया जाता है।वितरित लेनदेन के लिए, request_owner_type और request_owner_guid कॉलम अलग-अलग इकाई जानकारी दिखाएंगे।

उदाहरण के लिए, सत्र एस 1 तालिका 1 पर साझा लॉक का मालिक है; और लेनदेन टी 1, जो सत्र एस 1 के तहत चल रहा है, तालिका 1 पर एक साझा लॉक भी है। इस मामले में, resource_description कॉलम जो sys.dm_tran_locks द्वारा लौटाया गया है, उसी संसाधन के दो उदाहरण दिखाएगा। request_owner_type कॉलम एक उदाहरण के रूप में एक सत्र और दूसरा लेनदेन के रूप में दिखाएगा। इसके अलावा, resource_owner_id कॉलम के अलग-अलग मान होंगे।

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