क्या कोई मुझे SQL सर्वर 2005 में डेडलॉक के लिए मदद कर सकता है?गैर-सर्वर सूचकांक के साथ SQL Server 2005 डेडलॉक
एक साधारण परीक्षण के लिए, मेरे पास एक टेबल "बुक" है जिसमें प्राथमिक कुंजी (आईडी) और कॉलम नाम है। इस प्राथमिक कुंजी का डिफ़ॉल्ट अनुक्रमणिका nonclustered है।
डेडलॉक तब होता है जब दो सत्र एक ही समय में चलते हैं। गतिविधि मॉनिटर पहला सत्र "// चरण 1" दिखाता है जो एक्स लॉक के साथ पंक्ति (छुटकारा पाएं) को ताला लगा देता है। दूसरा सत्र पंक्ति यू लॉक और कुंजी यू लॉक रखता है। डेडलॉक चित्र से पहले सत्र के "// step2" में कुंजी यू लॉक की आवश्यकता होती है।
यदि सूचकांक क्लस्टर है, तो इस मामले में कोई डेडलॉक नहीं है। "// चरण 1" एक ही समय में पंक्ति और कुंजी लॉक रखेगा, इसलिए कोई समस्या नहीं है। मैं समझ सकता हूं कि एक पंक्ति को लॉक करने से इंडेक्स को भी लॉक कर दिया जाएगा क्योंकि क्लस्टर्ड इंडेक्स का पत्ता नोड पंक्ति डेटा है।
लेकिन, क्यों nonclustered अनुक्रमणिका इस तरह से है? यदि दूसरे सत्र में कुंजी यू लॉक है, तो पहले सत्र के "चरण 1" में इस लॉक को क्यों नहीं रखा जाता है क्योंकि वे अद्यतन कथन समान होते हैं।
--// first session
BEGIN TRAN
update Book set name = name where id = 1 //step 1
WaitFor Delay '00:00:20'
update Book set name = 'trans' where id = 1 //step2
COMMIT
--// second session
BEGIN TRAN
--// this statement will keep both RID(U lock) and KEY(U lock) if first session did not use HOLDLOCK
update Book set name = name where id = 1
COMMIT
क्या आपके पास अपनी नमूना बुक टेबल पर क्लस्टर्ड कुंजी है ?? मुझे नहीं लगता कि यह आपका प्रश्न है कि आपका पीके क्लस्टर किया गया है या नहीं - मुझे लगता है कि यह वास्तव में क्लस्टर्ड कुंजी (और इस प्रकार क्लस्टर्ड टेबल) है या आप एक ढेर से निपट रहे हैं या नहीं (कोई क्लस्टर इंडेक्स नहीं है)) –
क्या आप डेडलॉक में होने पर 'exec sp_lock' का प्रासंगिक आउटपुट जोड़ सकते हैं? – Andomar
sqlprofiler से, डेडलॉक चित्र दिखाता है कि पहले सत्र के "// step2" में कुंजी यू लॉक की आवश्यकता होती है, लेकिन यह seeion2 द्वारा आयोजित की जाती है। –