हम कैसे जांच कर सकते हैं कि किस डेटाबेस के ताले एक क्वेरी बैच के खिलाफ किन पंक्तियों पर लागू होते हैं?
कोई भी टूल जो वास्तविक समय में टेबल रो लेवल लॉक करने पर प्रकाश डालता है?
DB: SQL सर्वर 2005
हम कैसे जांच कर सकते हैं कि किस डेटाबेस के ताले एक क्वेरी बैच के खिलाफ किन पंक्तियों पर लागू होते हैं?
कोई भी टूल जो वास्तविक समय में टेबल रो लेवल लॉक करने पर प्रकाश डालता है?
DB: SQL सर्वर 2005
जवाबों:
अन्य प्रतिक्रियाओं में जोड़ने के लिए, sp_lock
सभी चल रही प्रक्रियाओं पर पूर्ण लॉक जानकारी को डंप करने के लिए भी उपयोग किया जा सकता है। आउटपुट जबरदस्त हो सकता है, लेकिन अगर आप जानना चाहते हैं कि वास्तव में लॉक क्या है, तो इसे चलाना एक मूल्यवान है। मैं आमतौर sp_who2
पर लॉकिंग समस्याओं में जल्दी शून्य होने के साथ-साथ इसका उपयोग करता हूं ।
sp_lock
प्रश्न में SQL सर्वर के संस्करण के आधार पर, ऑनलाइन "मित्रवत" प्रक्रियाओं के कई अलग-अलग संस्करण उपलब्ध हैं।
आपके मामले में, SQL सर्वर 2005 के लिए, sp_lock
अभी भी उपलब्ध है, लेकिन पदावनत, इसलिए अब sys.dm_tran_locks
इस तरह की चीज़ के लिए दृश्य का उपयोग करने की अनुशंसा की जाती है। आप एक उदाहरण पा सकते हैं कि कैसे "अपने स्वयं के रोल" के लिए यहां sp_lock फ़ंक्शन करें ।
यह वास्तव में आपको नहीं दिखा रहा है कि कौन सी पंक्तियाँ लॉक हैं, लेकिन यह आपके लिए उपयोगी हो सकता है।
आप यह जाँच कर सकते हैं कि इसे चलाकर कौन से कथन अवरुद्ध हैं:
select cmd,* from sys.sysprocesses
where blocked > 0
यह आपको यह भी बताएगा कि प्रत्येक ब्लॉक किस पर प्रतीक्षा कर रहा है। इसलिए आप यह पता लगा सकते हैं कि किस तरह के बयान के कारण पहला ब्लॉक दूसरे ब्लॉक का कारण बना।
@MikeBlandford से टिप्पणी जोड़ने के लिए संपादित करें :
अवरुद्ध स्तंभ अवरुद्ध प्रक्रिया के स्पिड को इंगित करता है। इसे ठीक करने के लिए आप मार {spid} चला सकते हैं।
आप वर्तमान पा सकते हैं अपनी मेज पर ताले क्वेरी का पालन करते हुए।
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');
देखें sysinos_tran_locks
यदि एक ही request_owner_type के कई उदाहरण मौजूद हैं, तो प्रत्येक उदाहरण को अलग करने के लिए request_owner_id कॉलम का उपयोग किया जाता है। वितरित लेनदेन के लिए, request_owner_type और request_owner_guid कॉलम अलग-अलग इकाई जानकारी दिखाएगा।
उदाहरण के लिए, सत्र S1 Table1 पर एक साझा लॉक का मालिक है; और लेनदेन T1, जो सत्र S1 के तहत चल रहा है, Table1 पर एक साझा लॉक का भी मालिक है। इस मामले में, resource_description स्तंभ द्वारा दिया जाता है sys.dm_tran_locks एक ही संसाधन के दो घटनाएं दर्शाते हैं। Request_owner_type स्तंभ एक सत्र के रूप में एक उदाहरण और लेन-देन के रूप में अन्य दिखाएगा। इसके अलावा, resource_owner_id कॉलम में अलग-अलग मान होंगे।
मैं लॉक को कैप्चर करने के लिए डायनामिक मैनेजमेंट व्यू (DMV) का उपयोग करता हूं और साथ ही उस वस्तु के object_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;
sp_who2
और में sys.dm_os_waiting_task
(दोनों एक ही तालिका अद्यतन करने के लिए कोशिश कर रहा है)। लेकिन आपका कथन किसी भी पंक्ति को वापस नहीं करता है। कोई विचार?
sp_who2
SQL सर्वर आवृत्ति पर वर्तमान अवरुद्ध और अवरुद्ध प्रक्रियाओं को प्राप्त करने के लिए आप अंतर्निहित संग्रहीत कार्यविधि का भी उपयोग कर सकते हैं । आमतौर पर आप एक अवरुद्ध प्रक्रिया को खोजने के लिए और प्रोफाइलर में जारी किए गए सबसे हालिया कमांड को देखने के लिए SQL Profiler उदाहरण के साथ इसे चलाएंगे।
आप नीचे स्क्रिप्ट के माध्यम से विवरण पा सकते हैं।
-- List all Locks of the Current Database
SELECT TL.resource_type AS ResType
,TL.resource_description AS ResDescr
,TL.request_mode AS ReqMode
,TL.request_type AS ReqType
,TL.request_status AS ReqStatus
,TL.request_owner_type AS ReqOwnerType
,TAT.[name] AS TransName
,TAT.transaction_begin_time AS TransBegin
,DATEDIFF(ss, TAT.transaction_begin_time, GETDATE()) AS TransDura
,ES.session_id AS S_Id
,ES.login_name AS LoginName
,COALESCE(OBJ.name, PAROBJ.name) AS ObjectName
,PARIDX.name AS IndexName
,ES.host_name AS HostName
,ES.program_name AS ProgramName
FROM sys.dm_tran_locks AS TL
INNER JOIN sys.dm_exec_sessions AS ES
ON TL.request_session_id = ES.session_id
LEFT JOIN sys.dm_tran_active_transactions AS TAT
ON TL.request_owner_id = TAT.transaction_id
AND TL.request_owner_type = 'TRANSACTION'
LEFT JOIN sys.objects AS OBJ
ON TL.resource_associated_entity_id = OBJ.object_id
AND TL.resource_type = 'OBJECT'
LEFT JOIN sys.partitions AS PAR
ON TL.resource_associated_entity_id = PAR.hobt_id
AND TL.resource_type IN ('PAGE', 'KEY', 'RID', 'HOBT')
LEFT JOIN sys.objects AS PAROBJ
ON PAR.object_id = PAROBJ.object_id
LEFT JOIN sys.indexes AS PARIDX
ON PAR.object_id = PARIDX.object_id
AND PAR.index_id = PARIDX.index_id
WHERE TL.resource_database_id = DB_ID()
AND ES.session_id <> @@Spid -- Exclude "my" session
-- optional filter
AND TL.request_mode <> 'S' -- Exclude simple shared locks
ORDER BY TL.resource_type
,TL.request_mode
,TL.request_type
,TL.request_status
,ObjectName
,ES.login_name;
--TSQL commands
SELECT
db_name(rsc_dbid) AS 'DATABASE_NAME',
case rsc_type when 1 then 'null'
when 2 then 'DATABASE'
WHEN 3 THEN 'FILE'
WHEN 4 THEN 'INDEX'
WHEN 5 THEN 'TABLE'
WHEN 6 THEN 'PAGE'
WHEN 7 THEN 'KEY'
WHEN 8 THEN 'EXTEND'
WHEN 9 THEN 'RID ( ROW ID)'
WHEN 10 THEN 'APPLICATION' end AS 'REQUEST_TYPE',
CASE req_ownertype WHEN 1 THEN 'TRANSACTION'
WHEN 2 THEN 'CURSOR'
WHEN 3 THEN 'SESSION'
WHEN 4 THEN 'ExSESSION' END AS 'REQUEST_OWNERTYPE',
OBJECT_NAME(rsc_objid ,rsc_dbid) AS 'OBJECT_NAME',
PROCESS.HOSTNAME ,
PROCESS.program_name ,
PROCESS.nt_domain ,
PROCESS.nt_username ,
PROCESS.program_name ,
SQLTEXT.text
FROM sys.syslockinfo LOCK JOIN
sys.sysprocesses PROCESS
ON LOCK.req_spid = PROCESS.spid
CROSS APPLY sys.dm_exec_sql_text(PROCESS.SQL_HANDLE) SQLTEXT
where 1=1
and db_name(rsc_dbid) = db_name()
--Lock on a specific object
SELECT *
FROM sys.dm_tran_locks
WHERE resource_database_id = DB_ID()
AND resource_associated_entity_id = object_id('Specific Table');