SQL सर्वर में बंद तालिका या पंक्ति का पता लगाना


20

मैं अवरुद्ध सत्र के विवरण को ट्रैक करने का तरीका जानने / सीखने की कोशिश कर रहा हूं।

इसलिए मैंने निम्नलिखित सेटअप बनाया:

create table foo (id integer not null primary key, some_data varchar(20));
insert into foo values (1, 'foo');
commit;

अब मैं दो अलग-अलग क्लाइंट से दो बार डेटाबेस से जुड़ता हूं।

पहले सत्र के मुद्दे:

begin transaction
update foo set some_data = 'update'
  where id = 1;

मैं स्पष्ट रूप से ताले रखने के लिए वहां प्रतिबद्ध नहीं हूं ।

दूसरे सत्र में मैं एक ही बयान जारी करता हूं और निश्चित रूप से ताला लगाने के कारण इंतजार करता हूं। अब मैं कोशिश कर रहा हूं कि सत्र 2 देखने के लिए विभिन्न प्रश्नों का उपयोग करें foo

sp_who2 निम्नलिखित दिखाता है (मैंने केवल महत्वपूर्ण जानकारी दिखाने के लिए कुछ कॉलम हटा दिए हैं):

SPID | स्थिति | ब्लकिबी | DBName | कमान | SPID | अनुरोध आईडी
----- + -------------- + ------- + ---------- + ---------- -------- + ------ + ----------
52 | नींद | । | खाद्य पदार्थ | AWAITING COMMAND | 52 | 0        
53 | नींद | । | खाद्य पदार्थ | AWAITING COMMAND | 53 | 0        
54 | SUSPENDED | 52 | खाद्य पदार्थ | UPDATE | 54 | 0        
56 | जंगम | । | खाद्य पदार्थ | चुनें INTO | 56 | 0        

यह उम्मीद की जाती है, सत्र 52 से अन-प्रतिबद्ध परिवर्तनों से सत्र 54 अवरुद्ध है।

क्वेरी करना sys.dm_os_waiting_tasksभी यह दर्शाता है। बयान:

select session_id, wait_type, resource_address, resource_description
from sys.dm_os_waiting_tasks
where blocking_session_id is not null;

रिटर्न:

session_id | Wait_type | संसाधन_ड्रेस | resource_description                                                            
----------- + ----------- + -------------------- + ----- -------------------------------------------------- --------------------------
        54 | LCK_M_X | 0x000000002a35cd40 | कीलॉक गूढ़ = 72057594046054400 dbid = 6 id = lock4ed1dd780 मोड = X संबद्धOjectId = 72057594046054400

फिर से यह उम्मीद है।

मेरी समस्या यह है, कि मैं यह पता नहीं लगा सकता कि वास्तविक वस्तु का नाम कैसे पाया जाए जो सत्र ५४ की प्रतीक्षा कर रहा है।

मैं कई प्रश्नों कि शामिल हो रहे हैं पाया है sys.dm_tran_locksऔर sys.dm_os_waiting_tasksइस तरह:

SELECT ....
FROM sys.dm_tran_locks AS l
  JOIN sys.dm_os_waiting_tasks AS wt ON wt.resource_address = l.lock_owner_address

लेकिन मेरे उपरोक्त परीक्षण परिदृश्य में यह शामिल नहीं है। तो या तो वह जुड़ना गलत है या dm_tran_locksवास्तव में वह जानकारी नहीं है जिसकी मुझे तलाश है।

इसलिए मैं जो खोज रहा हूं वह एक ऐसी क्वेरी है जो कुछ इस तरह लौटाती है:
" सत्र 54 टेबल में लॉक की प्रतीक्षा कर रहा हैfoo "।


कुछ पृष्ठभूमि जानकारी:

मैं जिस वास्तविक जीवन की समस्या को हल करने की कोशिश कर रहा हूं, वह थोड़ी अधिक जटिल है, लेकिन इस सवाल पर उबलती है "किस मेज पर सत्र 54 का इंतजार है"। प्रश्न में समस्या में एक लार्जिश संग्रहित प्रक्रिया शामिल होती है जो कई तालिकाओं को अद्यतन करती है और एक दृश्य से चयन करती है जो उन तालिकाओं में से कुछ को एक्सेस करती है। selectबयान अवरुद्ध है भले ही हम स्नैपशॉट अलगाव है और प्रतिबद्ध स्नैपशॉट सक्षम पढ़ें। पता लगाना कि चयन क्यों अवरुद्ध है (जो मुझे लगा कि स्नैपशॉट अलगाव को सक्षम किया गया है तो संभव नहीं होगा) अगला कदम होगा।

पहले कदम के रूप में मैं यह जानना चाहता हूं कि उस सत्र का क्या इंतजार है।


msdn.microsoft.com/en-us/library/ms190345.aspx का कहना है कि आपका जुड़ना सही है।
मैक्स वर्नन

@MaxVernon: इसकी पुष्टि के लिए धन्यवाद। लेकिन फिर मैं और भी उलझन में हूँ। यह कुछ भी क्यों नहीं लौटता है, हालांकि मुझे पता है कि एक ताला और अवरुद्ध सत्र है?
a_horse_with_no_name 13

मैं SQL Server 2012 में आपके द्वारा देखी जा रही समस्या को फिर से बनाने में असमर्थ हूं। मैंने एक परीक्षण डेटाबेस बनाया, RCSI को सक्षम किया, आपकी तालिकाएँ बनाईं, और दोनों अपडेट स्टेटमेंट चलाए, और मुझे आपकी अंतिम क्वेरी द्वारा लौटाई गई एक पंक्ति दिखाई दे रही है।
मैक्स वर्नोन

यदि आप अपने ताले का पता लगाने में एक दृश्य सहायता चाहते हैं तो SQL ताला खोजक नामक एक खुला स्रोत उपकरण उपलब्ध है। आप पर स्रोत पा सकते हैं: github.com/LucBos/SqlLockFinder या पर निष्पादन योग्य डाउनलोड करें: sqllockfinder.com हम आपको किसी भी योगदान से प्यार करते हैं जो आप कोड में कर सकते हैं ताकि हम इसे बेहतर बना सकें।
ल्यूक बोस

जवाबों:


23

मुझे लगता है कि यह वही करता है जो आपको चाहिए।

USE 'yourDB'
GO
SELECT  
    OBJECT_NAME(p.[object_id]) BlockedObject
FROM    sys.dm_exec_connections AS blocking
    INNER JOIN sys.dm_exec_requests blocked
        ON blocking.session_id = blocked.blocking_session_id
    INNER JOIN sys.dm_os_waiting_tasks waitstats
        ON waitstats.session_id = blocked.session_id
    INNER JOIN sys.partitions p ON SUBSTRING(resource_description, 
        PATINDEX('%associatedObjectId%', resource_description) + 19, 
        LEN(resource_description)) = p.partition_id

3

आप इसे आज़मा सकते हैं :

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