मैं अवरुद्ध सत्र के विवरण को ट्रैक करने का तरीका जानने / सीखने की कोशिश कर रहा हूं।
इसलिए मैंने निम्नलिखित सेटअप बनाया:
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
बयान अवरुद्ध है भले ही हम स्नैपशॉट अलगाव है और प्रतिबद्ध स्नैपशॉट सक्षम पढ़ें। पता लगाना कि चयन क्यों अवरुद्ध है (जो मुझे लगा कि स्नैपशॉट अलगाव को सक्षम किया गया है तो संभव नहीं होगा) अगला कदम होगा।
पहले कदम के रूप में मैं यह जानना चाहता हूं कि उस सत्र का क्या इंतजार है।