सबसे पहले, select
कथन ओरेकल में कभी भी कुछ भी लॉक नहीं करता है, केवल डेटा के अंतिम उपलब्ध संगत संस्करण का उपयोग करता है। यह select ... for update
जो update
. जैसे डेटा को लॉक कर देता है Oracle 9i के बाद से, लेकिन कोई for update
. नहीं हैं प्रश्न से प्रश्न में खंड।
Resource Name process session holds waits process session holds waits
TM-000151a2-00000000 210 72 SX SSX 208 24 SX SSX
सत्र #72 में "रो एक्सक्लूसिव" टाइप (एसएक्स) के साथ टेबल-लेवल लॉक (टीएम) है और उसी टेबल पर "शेयर रो एक्सक्लूसिव" (एसएसएक्स) लॉक हासिल करना चाहते हैं। इस सत्र को सत्र #24 द्वारा अवरुद्ध किया गया है, जिसमें पहले से ही एक ही प्रकार (एसएक्स) का टेबल-स्तरीय लॉक है और एसएसएक्स लॉक उपलब्ध होने तक प्रतीक्षा करता है।
Resource Name process session holds waits process session holds waits
TM-000151a2-00000000 208 24 SX SSX 210 72 SX SSX
यह (दूसरी पंक्ति) ठीक उसी स्थिति को प्रदर्शित करता है, लेकिन विपरीत दिशा में:सत्र #24 SSX लॉक उपलब्ध होने की प्रतीक्षा करता है, लेकिन सत्र #72 द्वारा अवरुद्ध किया जाता है जो पहले से ही उसी टेबल पर SX लॉक रखता है।
इसलिए, सत्र #24 और सत्र #72 एक दूसरे को अवरुद्ध करते हैं:गतिरोध होता है।
दोनों प्रकार के लॉक (SX और SSX) टेबल-लेवल लॉक हैं।
स्थिति को समझने के लिए मैं फ्रेंक पचोट के इस लेख को पढ़ने की सलाह देता हूं।
नीचे इस लेख का उद्धरण दिया गया है, जो आपकी स्थिति के लिए सीधे प्रासंगिक है (ध्यान दें कि SSX और SRX संक्षिप्ताक्षर समान हैं):
<ब्लॉकक्वॉट>
रेफ़रेंशियल अखंडता भी TM ताले प्राप्त करती है। उदाहरण के लिए, जब आप एक डिलीट जारी करते हैं, या पैरेंट टेबल पर कुंजी पर अपडेट करते हैं, तो अनइंडेक्स्ड फॉरेन कीज़ के साथ सामान्य समस्या चाइल्ड टेबल पर S लॉक की ओर ले जाती है। इसका कारण यह है कि एक सूचकांक के बिना, ओरेकल के पास एक समवर्ती सम्मिलन को रोकने के लिए लॉक करने के लिए कोई भी निचला स्तर संसाधन नहीं है जो संदर्भात्मक अखंडता का उल्लंघन कर सकता है।
जब विदेशी कुंजी कॉलम एक नियमित इंडेक्स में अग्रणी कॉलम होते हैं, तो पहली इंडेक्स एंट्री पेरेंटवैल्यू को एक संसाधन के रूप में इस्तेमाल किया जा सकता है और एक पंक्ति स्तर TXlock के साथ लॉक किया जा सकता है।
और क्या होगा यदि रेफरेंशियल अखंडता में एक डिलीट कैस्केड है? एस मोड के अलावा, चाइल्ड टेबल में पंक्तियों को अपडेट करने का इरादा है, जैसा कि रो एक्स (आरएक्स) मोड के साथ होता है। यह वह जगह है जहां शेयर रो एक्सक्लूसिव (SRX) होता है:S+RX=SRX।
तो, सबसे संभावित रूप यह है कि सत्र #72 और सत्र #24 EMPLOYEE
में कुछ पंक्तियों को हटा देता है एक ही समय में तालिका, और on delete cascade
. हैं EMPSAL_EMP_ID
. के लिए बाधा EMPLOYEE_SALARY
. पर अनुक्रमणिका की अनुपस्थिति के साथ संयोजन में तालिका जिसमें EMPSAL_EMP_ID
पहले सूचीबद्ध कॉलम।