Oracle डेटाबेस उद्योग में व्यापक रूप से उपयोग किया जाने वाला डेटाबेस है। यहाँ मैं ओरेकल लॉक, ऑरैकल टेबल लॉक के बारे में समझाने की कोशिश कर रहा हूँ
विषय-सूची
Oracle Enqueue और Locks क्या है
Enqueue Oracle ताले हैं जो साझा संरचना के संचालन को क्रमबद्ध करते हैं। साझा संरचना तालिका हो सकती है, धागे को फिर से करें और लेनदेन करें।
जब कोई उपयोगकर्ता A तालिका में पंक्ति 12 को अद्यतन करता है, तो वह लेन-देन Enqueue (लॉक) प्राप्त करता है। यह हासिल किया जाता है ताकि कोई भी उपयोगकर्ता जिसे मैं तालिका में उसी पंक्ति 12 को अपडेट करने का प्रयास कर रहा हूं, तब तक प्रतीक्षा करेगा जब तक कि उपयोगकर्ता ए लेनदेन नहीं करता। तो अब यदि उपयोगकर्ता B उसी पंक्ति को अद्यतन करने का प्रयास करता है, तो वह कतार में प्रतीक्षा करेगा।
उपयोगकर्ता A द्वारा लेन-देन करने के बाद, उपयोगकर्ता B लेन-देन आगे बढ़ेगा
हमारे पास सिंगल इंस्टेंस डेटाबेस में स्थानीय एनक्यू है जबकि ओरेकल आरएसी के साथ, हमारे पास साझा संसाधन को प्रबंधित करने के लिए स्थानीय एनक्यू और ग्लोबल एनक्यू है
एनक्यू पहचानकर्ता क्या है
फ़ॉर्मैट का इस्तेमाल करके कतार की खास पहचान की जाती है
<संसाधन प्रकार>
संसाधन कर सकते हैं
टीएम -> टेबल लॉक
MR-> मीडिया रिकवरी
TX-> लेन-देन
Id1 और id2 वे संख्याएँ हैं जो विभिन्न संसाधन प्रकारों के लिए भिन्न हैं
जैसे टेबल लॉक (TM) के लिए इसे इस प्रकार लिखा जाता है
TM-<टेबल की ऑब्जेक्ट आईडी>-0
जब कोई उपयोगकर्ता कुछ मोड में संसाधन तक पहुंच का अनुरोध करता है, तो एक एनक्यू पहचानकर्ता उत्पन्न होता है जिसे ऊपर बताया गया है
कतार इन मोड में आयोजित की जाती है
एसएस: रो शेयर मोड
SX:रो एक्सक्लूसिव मोड
एस: टेबल को शेयर मोड में लॉक करें
SSX:टेबल को शेयर मोड में और रो को एक्सक्लूसिव मोड में लॉक करें
X:टेबल को एक्सक्लूसिव मोड में लॉक करें
एनक्यू संसाधन क्या है
प्रत्येक एनक्यू को Oracle सर्वर द्वारा एक संसाधन संरचना के माध्यम से बनाए रखा जाता है और इसे ऊपर बताए अनुसार पहचाना जाता है। एक संसाधन संरचना में तीन सूचियाँ होती हैं
- स्वामी सूची
- प्रतीक्षा सूची
- कन्वर्टर सूची
जब कोई उपयोगकर्ता निश्चित मोड में संसाधन पर लॉक का अनुरोध करता है, तो उसे लॉक संरचना प्राप्त होती है और यह कुछ संसाधनों पर लॉक प्राप्त करने का अनुरोध करता है। इसे आवश्यक लॉक के अनुसार संसाधन संरचना की इन सूचियों में रखा जाता है।
तो उपयोगकर्ता पहले उस संसाधन का अनुरोध कर रहा है, फिर उसे स्वामी सूची में रखा जाएगा
संसाधन संरचना संसाधन तालिका से प्राप्त की जाती है और लॉक संरचना लॉक तालिका से प्राप्त की जाती है। वे दोनों एसजीए में आवंटित की जाती हैं
संसाधन तालिका में पंक्तियों की संख्या को इनिशियलाइज़ेशन पैरामीटर enqueue_resources द्वारा परिभाषित किया गया है। उपयोग में आने वाले मान v$resource दृश्य में देखे जा सकते हैं
लॉक संरचना तालिका में पंक्तियों की संख्या आरंभीकरण पैरामीटर _enqueue_locks द्वारा परिभाषित की गई है। उपयोग में आने वाले मान v$enqueue_lock
. में देखे जा सकते हैंसंसाधन तालिका में लुकअप कैसे किया जाता है?
- संसाधन तालिका में सभी संसाधन संरचना शामिल है। संसाधन तालिका में संसाधन संरचना को खोजने और उस तक पहुंचने के लिए हैशिंग एल्गोरिथम का उपयोग किया जाता है।
- संसाधन तालिका को हैश बकेट में व्यवस्थित किया गया है। प्रत्येक हैश बकेट में लिंक की गई सूची के रूप में संसाधन संरचना की एक सूची होती है।
- जब संसाधन की खोज की जाती है, तो हैशिंग एल्गोरिथम का उपयोग करके इसका हैश प्राप्त किया जाता है और फिर संबंधित हैश बकेट को खोजने के लिए लैच प्राप्त किया जाता है और फिर संसाधन को हैश बकेट में सूची में खोजा जाता है। यदि संसाधन पाया जाता है, तो लॉक संरचना प्राप्त की जाती है और अनुरोध को स्वामी, वेटर और कन्वर्ट सूची पर अनुरोधित लॉक के निर्दिष्ट स्तर के अनुसार रखा जाता है
उदाहरण TM-575-0 संसाधन हैश टू बकेट 1, हैश बकेट तक पहुँचने के लिए एक लैच एनक्यू हैश श्रृंखला प्राप्त की जाती है और संसाधन संरचना प्राप्त करने के लिए सूची को बकेट में एक्सेस किया जाता है
- यदि संसाधन बकेट सूची में नहीं मिलता है और संसाधन मुक्त सूची से एक नई संसाधन संरचना प्राप्त की जाती है और बकेट सूची में रखी जाती है। यह कुंडी Enqueue के तहत होता है। एक ताला संरचना भी आवंटित की जाती है
लॉक अनुरोध को संसाधन संरचना की स्वामी सूची में रखा गया है
एनक्यू ऑपरेशन कैसे काम करता है?
जब कोई उपयोगकर्ता संसाधन पर लॉक का अनुरोध करता है, तो Oracle सर्वर निम्नलिखित कार्य करता है
- यदि यह वर्तमान में स्वामित्व में नहीं है, तो संसाधन उपयोगकर्ता को प्रदान किया जाता है
- यदि यह स्वामित्व में है और इसमें वेटर और कन्वर्टर हैं, तो इसे वेटर्स की कतार में सबसे नीचे रखा जाता है
- यदि यह स्वामित्व में है, लेकिन कोई वेटर और कनवर्टर नहीं है, तो यदि यह स्वामी लॉक के साथ संगत है, तो अनुरोध दिया जाता है। अगर यह संगत नहीं है, तो इसे वेटर सूची में डाल दिया जाता है
- एक कनवर्टर को आगे बढ़ने की अनुमति दी जाती है यदि अनुरोध वर्तमान में होल्ड किए गए लॉक से कम प्रतिबंधात्मक है या अनुरोधित मोड अन्य स्वामी द्वारा रखे गए लॉक के साथ संगत है
- एक वेटर को आगे बढ़ने की अनुमति है यदि कनवर्टर सूची खाली है, उसके आगे कोई वेटर नहीं है और अनुरोध किया गया लॉक वर्तमान में मौजूद लॉक के साथ संगत है
- कन्वर्टर को हमेशा वेटर्स के सामने संसाधित किया जाता है।
- Oracle सर्वर हर बार लॉक जारी होने या परिवर्तित होने पर इन कतारों की जाँच करता है।
Oracle लॉक जारी या परिवर्तित होने पर कतार की जाँच कैसे की जाती है
- सेमाफोर पर सोए संसाधनों की प्रतीक्षा करने वाली प्रक्रियाएं, और सेमाफोर का उपयोग स्लीप/वेक-अप तंत्र के रूप में किया जाता है। कतार में कतारबद्ध होने के बाद, अनुरोध करने की प्रक्रिया सिंक_ऑप कॉल का उपयोग करके सेमाफोर पर सो जाएगी।
sync_op(SYNC_WAIT, SYNCF_BINARY, 300) =1
- एक बार जब संसाधन रखने वाली प्रक्रिया संसाधन जारी करने के लिए तैयार हो जाती है, तो यह संसाधन संरचना से जुड़ी कतार को देखती है। यदि कतार में कोई प्रक्रिया है, तो यह प्रतीक्षा प्रक्रिया को एक सेमाफोर संकेत भेजता है का उपयोग करके
सिंक_ऑप कॉल।
sync_op(0x0005, SYNCF_BINARY, 134491620) =1
- प्रतीक्षा प्रक्रिया सिग्नल को संभाल लेगी और जाग जाएगी। यह प्रतीक्षा प्रक्रिया एनक्यू ऑपरेशन में दिए गए चरणों के अनुसार स्थिति को संशोधित करती है
एनक्यू के सामान्य प्रकार
JQ - कार्य कतार। जब कोई कार्य (DBMS_JOB.SUBMIT द्वारा सबमिट किया गया) चल रहा होता है, तो वह JQ एनक्यू द्वारा सुरक्षित होता है (जिसका अर्थ है कि केवल एक SNP-प्रक्रिया ही कार्य को चला सकती है)।
ST - अंतरिक्ष प्रबंधन लेनदेन . एसटी एनक्यू को हर बार सत्र के आवंटन / डी-आवंटन विस्तार (जिसका अर्थ है कि यूईटी $ और एफईटी $ डिक्शनरी टेबल को बदलना चाहता है), जैसे कोलेसिंग, ड्रॉप / ट्रंकेट सेगमेंट और डिस्क-सॉर्टिंग को आयोजित करने की आवश्यकता है। यदि एसटी एनक्यू का अनुरोध करते समय सत्र को टाइमआउट मिलता है, तो "ओआरए -1575 टाइमआउट स्पेस मैनेजमेंट के लिए प्रतीक्षा कर रहा है" वापस आ गया है।
TM – DML (टेबल) एनक्यू. हर बार जब कोई सत्र किसी तालिका को लॉक करना चाहता है, तो एक TM कतार का अनुरोध किया जाता है। यदि कोई सत्र पैरेंट-टेबल (डीईपीटी) में एक पंक्ति को हटा देता है और चाइल्ड-टेबल (ईएमपी) पर एक इंडेक्स के बिना एक रेफरेंशियल बाधा (विदेशी कुंजी) बनाई जाती है, या यदि सत्र कॉलम को अपडेट कर रहा है कि विदेशी फिर चाइल्ड टेबल पर एक शेयर लॉक (स्तर 4) का मुख्य संदर्भ लिया जाता है। यदि कोई अन्य सत्र चाइल्ड-टेबल में परिवर्तन करने का प्रयास करता है तो उन्हें प्रतीक्षा करनी होगी (क्योंकि वे पंक्ति अनन्य मोड में कतार चाहते हैं, और यह शेयर मोड के साथ संगत नहीं है)। यदि चाइल्ड-टेबल के फॉरेन की-कॉलम पर एक इंडेक्स बनाया जाता है, तो चाइल्ड-टेबल पर किसी शेयर-लॉक की आवश्यकता नहीं होती है।
TX - लेन-देन। जैसे ही कोई लेन-देन शुरू होता है एक TX एनक्यू की आवश्यकता होती है। रोलबैक सेगमेंट नंबर, रोलबैक सेगमेंट की ट्रांजेक्शन टेबल में स्लॉट नंबर और स्लॉट नंबर की क्रम संख्या द्वारा लेनदेन को विशिष्ट रूप से परिभाषित किया जाता है। एक सत्र कई कारणों से TX एनक्यू पर प्रतीक्षा कर सकता है:
1) एक और सत्र अनुरोधित पंक्ति को लॉक कर रहा है।
2) जब दो सत्र एक ही अद्वितीय कुंजी को तालिका में सम्मिलित करने का प्रयास करते हैं (उनमें से किसी ने भी COMMIT नहीं किया है), तो अंतिम सत्र पहले वाले के लिए COMMIT या ROLLBACK की प्रतीक्षा कर रहा है।
3) ब्लॉक हेडर में कोई मुफ्त आईटीएल (इच्छुक लेनदेन सूची) नहीं है (सेगमेंट के लिए INI_TRANS और PCT_FREE बढ़ाएं)।
UL - उपयोगकर्ता लॉक . DBMS_LOCK.REQUEST फ़ंक्शन के साथ एक सत्र ने लॉक ले लिया है।
Oracle एनक्यू और Oracle लॉक देखने के लिए व्यू और टेबल
V$session और v$session_wait
सत्र कब कतार या लॉक पर प्रतीक्षा कर रहा है, यह V$session (11g और अधिक में) और v$session_wait
से सत्र हो सकता हैv$session_wait से * चुनें जहां 'enq%' जैसी घटना हो;एनक्यू प्रतीक्षा घटना के पैरामीटर का निम्नलिखित अर्थ हैP1:संसाधन प्रकार और मोड वांछितP2:संसाधन का ID1P3:संसाधन का ID2
सिस्टम में सभी एनक्यू प्राप्त करने के लिए हम नीचे दी गई क्वेरी का उपयोग कर सकते हैं
v$session_wait से इवेंट,p1, p2,p3 चुनें जहां wait_time=0 और 'enq%' जैसा इवेंट;
- V$lock एनक्यू की जांच करने के लिए एक और उपयोगी दृश्य है
- V$lock वर्तमान में सिस्टम में मौजूद सभी लॉक संरचना को सूचीबद्ध करता है
- कॉलम प्रकार ,id1 और id2 संसाधन संरचना के संसाधन प्रकार ,id1 और id2 का प्रतिनिधित्व करते हैं। इसलिए इसे V$resource के साथ जोड़ा जा सकता है जिसमें सभी संसाधन संरचना की सूची शामिल है
- LMODE और अनुरोध हमें बताता है कि कौन सी कतार (मालिक, कन्वर्टर, वेटर) सत्र है
LMODE | अनुरोध | कतार का नाम |
> 0 | =0 | स्वामी |
=0 | > 0 | वेटर |
> 0 | > 0 | कन्वर्टर |
धारक और वेटर को खोजने के लिए नीचे दी गई क्वेरी का उपयोग किया जा सकता है
चयन करें inst_id, DECODE (अनुरोध, 0, 'धारक:', 'वेटर:') || sid sess, id1, id2, lmode, अनुरोध, V$LOCKWHERE से टाइप करें (id1, id2, प्रकार) IN (आईडी 1 चुनें) , id2, V$LOCK से टाइप करें जहां अनुरोध>0) id1 द्वारा आदेश, अनुरोध;
आरएसी के मामले में, ब्लॉकर्स और वेटर्स का पता लगाने के लिए नीचे दी गई क्वेरी का इस्तेमाल किया जा सकता है
inst_id चुनें, DECODE (अनुरोध, 0, 'धारक:', 'वेटर:') || sid sess, id1, id2, lmode, अनुरोध, टाइप करें GV$LOCKWHERE से (id1, id2, प्रकार) IN (आईडी 1 चुनें) , id2, gV$LOCK से टाइप करें जहां अनुरोध>0) id1 द्वारा आदेश, अनुरोध;
V$locked_object
यह Oracle टेबल लॉक के लिए एक और उपयोगी दृश्य है
इसमें डेटाबेस के सभी TM लॉक होते हैं। यह लेन-देन स्लॉट देता है, OS प्रक्रिया है और सत्र की सत्र आईडी जिसमें TM ताले हैं
कई दृश्य हैं जिनका उपयोग ताले की जानकारी खोजने के लिए किया जा सकता है। ये दृश्य catblock.sql द्वारा बनाए गए हैं
DBA_LOCKS | v$lock जैसे सभी ताले दिखाएं |
DBA_DML_LOCKS | सभी DML™ लॉक होल्ड किए गए या अनुरोध किए जा रहे हैं | . दिखाता है
DBA_DDL_LOCKS | सभी डीडीएल लॉक को दिखाता है या अनुरोध किया जा रहा है |
DBA_WAITERS | उन सभी सत्रों को दिखाता है जो प्रतीक्षारत हैं, लेकिन लॉक होने के लिए प्रतीक्षारत नहीं हैं |
DBA_BLOCKERS | नॉन-वेटिंग सेशन दिखाता है जिसमें लॉक को वेटिंग-ऑन रखा जा रहा है |
Oracle में प्रतीक्षा सत्र और होल्डिंग सत्रों का पता लगाने के लिए क्वेरी
सेट लाइनसाइज 1000कॉलम वेटिंग_सेशन हेडिंग 'वेटिंग|सेशन'कॉलम होल्डिंग_सेशन हेडिंग 'होल्डिंग|सेशन'कॉलम लॉक_टाइप फॉर्मेट ए15कॉलम मोड_हेल्ड फॉर्मेट ए15कॉलम मोड_अनुरोधित फॉर्मेट ए15सेलेक्टवेटिंग_सेशन,होल्डिंग_सेशन,लॉक_टाइप,मोड_होल्ड,लॉक_आईडी1,लॉक_सेशन,लॉक_टाइप,मोड_होल्ड,मोड_रिक्वेस्टसभी बंद वस्तुओं का पता लगाने के लिए क्वेरी
सेट टर्म ऑन;सेट लाइन्स 130;कॉलम sid_ser फॉर्मेट a12 हेडिंग 'सेशन,|सीरियल#';कॉलम यूजरनेम फॉर्मेट a12 हेडिंग 'os यूजर/|डीबी यूजर';कॉलम प्रोसेस फॉर्मेट a9 हेडिंग 'os|प्रोसेस';कॉलम स्पिड फॉर्मेट ए7 हेडिंग 'ट्रेस|नंबर';कॉलम ओनर_ऑब्जेक्ट फॉर्मेट ए35 हेडिंग 'ओनर.ऑब्जेक्ट';कॉलम लॉक_मोड फॉर्मेट ए13 हेडिंग 'लॉक्ड|मोड';कॉलम स्टेटस फॉर्मेट ए8 हेडिंग 'स्टेटस';सेलेक्ट सबस्ट्र (to_char(l.session_id)| |','||to_char(s.serial#),1,12) sid_ser,substr(l.os_user_name||'/'||l.oracle_username,1,12) यूजरनेम,l.प्रोसेस,p.spid, substr(o.owner||'.'||o.object_name,1,35) owner_object,decode(l.locked_mode,1,'No Lock',2,'Row Share',3,'Row Exclusive',4 ,'साझा करें',5,'शेयर पंक्ति बहिष्करण',6,'अनन्य',शून्य) lock_mode,substr(s.status,1,8) statusfromv$locked_object l,all_objects o,v$session s,v$process जहां .object_id =o.object_idऔर l.session_id =s.sidand s.paddr =p.addrand s.status !='KILLED'/Oracle सर्वर में DML लॉक को कैसे हैंडल किया जाता है
जब कोई अद्यतन, सम्मिलित करता है, हटाता है या अद्यतन के लिए चयन करता है तो oracle तालिका पर निष्पादित होता है, Oracle इन दो तालों को लेता है
- डीएमएल टेबल लॉक:लेनदेन की अवधि के लिए वस्तु परिभाषा स्थिरता सुनिश्चित करने के लिए। यह डीएमएल के प्रगति पर होने के दौरान किसी भी डीडीएल संचालन को होने से रोकता है।
- DML Row Lock:यह लेनदेन के निष्पादन के दौरान डेटा की स्थिरता सुनिश्चित करने के लिए है। हम इसे इस तरह से फिर से लिख सकते हैं कि यह स्पर्श की जाने वाली विशेष पंक्ति पर एक लॉक प्राप्त करता है और उसी पंक्ति को संशोधित करने का प्रयास करने वाला कोई भी अन्य लेन-देन तब तक अवरुद्ध हो जाता है, जब तक कि पहले से ही इसका स्वामित्व समाप्त नहीं हो जाता
Oracle टेबल लॉक कैसे लागू किया जाता है
हमने पहले ही पिछले भाग में Enqueue के बुनियादी ढांचे के बारे में बताया था। Oracle Table Locks TM Enqueue के रूप में कार्यान्वित किया जाता है
तो एनक्यू स्ट्रक्चर होगा
TM-<टेबल ऑब्जेक्ट id> -0
मोड हैं
रुपये:पंक्ति शेयर
RX:पंक्ति अनन्य
एस:शेयर
SRX:शेयर पंक्ति अनन्य
एक्स:अनन्य
प्रत्येक कर्सर टेबल लॉक संरचना की एक सूची रखता है जो स्टेटमेंट को पार्स करते समय बनाई जाती है। पहले निष्पादन पर, सूची में सभी तालिका को लॉक करने के लिए फ़ंक्शन कॉल किया जाता है। लेन-देन होने या रोलबैक होने पर ताले जारी किए जाते हैं।
रोलबैक की संभावना, विशेष रूप से एक सेव पॉइंट पर रोलबैक, डिक्शनरी लॉकिंग में जटिलता का एक और आयाम जोड़ता है। अर्थात्, यदि किसी लेन-देन को उस बिंदु से आगे रोलबैक किया जाता है जिस पर लॉक अपग्रेड किया गया था, तो कृत्रिम गतिरोध के जोखिम को कम करने के लिए, रोलबैक ऑपरेशन के हिस्से के रूप में लॉक को तदनुसार डाउनग्रेड किया जाना चाहिए।
लेन-देन के लिए डिक्शनरी लॉकिंग की आवश्यकताएं और, विशेष रूप से, लॉक रूपांतरणों के इतिहास का रखरखाव, टीएम एनक्यू के संयोजन के साथ डीएमएल लॉक द्वारा प्रदान किया जाता है। डीएमएल लॉक रखने वाले प्रत्येक लेनदेन में टीएम एनक्यू लॉक भी होता है। बुनियादी लॉकिंग कार्यक्षमता एनक्यू द्वारा प्रदान की जाती है, और डीएमएल लॉक रूपांतरण इतिहास के रखरखाव को जोड़ता है।
DML लॉक संरचनाओं की निश्चित सरणी का आकार DML_LOCKS पैरामीटर द्वारा होता है। इसकी मुफ्त सूची डीएमएल लॉक आवंटन लैच द्वारा सुरक्षित है, और सक्रिय स्लॉट V$LOCKED_OBJECT में दिखाई दे रहे हैं।
DML_LOCKs सेट करने के लिए v$resource_limit में उपयोग की जांच करें। हम इसे उदारतापूर्वक सेट कर सकते हैं क्योंकि इसमें बहुत कम जगह लगती है
टेबल लॉक कैसे अक्षम करें?
- डीएमएल लॉक और संबंधित टीएम एनक्यू लॉक को या तो पूरी तरह से या केवल कुछ तालिकाओं के लिए अक्षम किया जा सकता है।
- इन तालों को पूरी तरह से अक्षम करने के लिए, DML_LOCKS पैरामीटर को शून्य पर सेट किया जाना चाहिए। समानांतर सर्वर डेटाबेस में, इसे सभी मामलों में शून्य पर सेट किया जाना चाहिए।
- किसी विशेष तालिका के विरुद्ध ऐसे तालों को अक्षम करने के लिए, ALTER TABLE विवरण के DISABLE TABLE LOCKS खंड का उपयोग किया जाना चाहिए।
- यदि किसी तालिका के लिए ताले अक्षम हैं, तो DML कथन अभी भी तालिका के ब्लॉकों को संशोधित कर सकते हैं, और पंक्ति-स्तरीय ताले अभी भी आयोजित किए जाते हैं। हालांकि, सब-शेयर्ड मोड टेबल लॉक सामान्य रूप से प्रश्नों से जुड़े होते हैं, और सब-एक्सक्लूसिव मोड टेबल लॉक आमतौर पर डीएमएल से जुड़े होते हैं, नहीं लिया जाता है। इसके बजाय, तालिका के विरुद्ध लेन-देन परस्पर विरोधी डीडीएल से सुरक्षित हैं, केवल संपूर्ण टेबल पर लॉक लेने के सभी प्रयासों को प्रतिबंधित करके, और इस प्रकार सभी डीडीएल को टेबल के विरुद्ध।
- टेबल लॉक को अक्षम करने से प्रदर्शन में वृद्धि हो सकती है क्योंकि लॉक अधिग्रहण ओवरहेड कम हो जाता है आरएसी के मामले में यह विशेष रूप से महत्वपूर्ण है जहां यह ओवरहेड काफी अधिक है।
- टेबल लॉक को अक्षम करने से विदेशी कुंजी इंडेक्स बनाने से भी रोका जा सकता है। चूंकि चाइल्ड टेबल के टेबल लॉक से बचने के लिए विदेशी कुंजी को अनुक्रमित करने की आवश्यकता होती है, जबकि पंक्तियों को मूल तालिका में हेरफेर किया जाता है। तो अगर हम टेबल लॉक को एक साथ अक्षम कर देते हैं तो इंडेक्स की आवश्यकता नहीं होती है
- किसी टेबल पर टेबल लॉक को डिसेबल करने के लिए dml_locks टेबल पर सेट करने के लिए अल्टर टेबल का उपयोग करना बेहतर होता है। जैसे कि dml_locks शून्य पर सेट है, हमें इसे फिर से सेट करने के लिए इंस्टेंस को बाउंस करना होगा
- डायरेक्ट लोड इंसर्ट में, एक सत्र TM एनक्यू को 'X' मोड में ले जाएगा। यह किसी भी अन्य डीएमएल को होने से रोकता है, जबकि सभी डीडीएल को अवरुद्ध करने के अलावा, प्रत्यक्ष लोड हो रहा है
DML रो लॉक कैसे लागू किया जाता है
डीएमएल रो लॉक को निम्नलिखित दो चीजों के संयोजन के रूप में लागू किया जाता है
- पंक्ति स्तर लॉक:इसे प्रत्येक पंक्ति शीर्षलेख में लॉक बाइट के रूप में और प्रत्येक डेटा या इंडेक्स ब्लॉक में आईटीएल (इच्छुक लेनदेन सूची) के रूप में कार्यान्वित किया जाता है। इन्हें कहीं भी कैश नहीं किया जाता है और चूंकि ये ब्लॉक में ही संग्रहीत होते हैं SGA में नहीं, जो कि सीमित है, oracle द्वारा लॉक करने का यह तंत्र बड़े पैमाने पर स्केलेबल है
- लेन-देन लॉक:इन्हें TX Enqueue के रूप में लागू किया जाता है
लॉक बाइट ब्लॉक में आईटीएल प्रविष्टि को इंगित करता है और लेनदेन के लिए सभी आईटीएल प्रविष्टियां TX एनक्यू को इंगित करती हैं जो अंततः निर्धारित करती है कि लेनदेन प्रतिबद्ध है या रोलबैक है। वेटर लेन-देन लॉक होने पर प्रतीक्षा करेंगे
उदाहरण
- एक लेन-देन ए ब्लॉक में पंक्तियों 2 और 3 को अपडेट करना चाहता है। यह एक आईटीएल (इच्छुक लेनदेन सूची) आवंटित करेगा। लेन-देन पंक्ति 2 और 3 तक पहुँचता है और लॉक बाइट देखता है। यदि लॉक बाइट शून्य है, तो यह लॉक नहीं है। लेन-देन पंक्ति 3 ,3 को अपडेट करेगा
- अब एक लेन-देन B शुरू होता है और वह 1 पंक्तियों को अपडेट करना चाहता है। यह एक आईटीएल (इच्छुक लेनदेन सूची) आवंटित करेगा। लेन-देन पंक्ति 1 तक पहुंचता है और लॉक बाइट देखता है। यदि लॉक बाइट शून्य है, तो यह लॉक नहीं है। लेन-देन पंक्ति 1 को अपडेट करेगा
- अब लेन-देन पंक्ति 2 को अपडेट करना चाहता है। यह पंक्ति तक पहुंच जाएगा और इसे लॉक कर देगा क्योंकि लॉक बाइट शून्य नहीं होगा। यह उस आईटीएल में दिखेगा जिसमें ताला लगा है। यह पता लगाने के लिए आईटीएल क्लीनआउट करेगा कि लेनदेन सक्रिय है या सक्रिय नहीं है। इस मामले में, यह लेनदेन ए को सक्रिय पाएगा। तो लेन-देन बी को रोलबैक या प्रतिबद्ध करने के लिए लेनदेन ए पर इंतजार करना पड़ता है। लेन-देन B, TX Enqueue की मांग पर प्रतीक्षा करेगा, जिसे लेन-देन A अनन्य मोड में रखता है
इच्छुक लेनदेन सूची (ITL) क्या है
जब कोई सत्र किसी ब्लॉक को संशोधित करना चाहता है, तो उसे ब्लॉक में एक आईटीएल आवंटित करना होगा। आईटीएल ब्लॉक हेडर में डेटा संरचना है जिसमें कई स्लॉट होते हैं जो लेनदेन द्वारा लिए जाते हैं। तालिका बनाते समय इसे पैरामीटर INITRANS और MAXTRANS द्वारा परिभाषित किया जाता है। प्रारंभिक संख्या में स्लॉट INITTRANS के अनुसार बनाए गए हैं और वे गतिशील रूप से अधिकतम MAXTRANS तक बढ़ते हैं
लेन-देन क्या है?
जब कोई सत्र अपडेट/डिलीट/सम्मिलित करता है, तो एक लेन-देन शुरू हो जाता है। यह तब पूरा होता है जब कमिट या रोलबैक हुआ। लेन-देन पहचानकर्ता (XID) द्वारा लेन-देन की पहचान की जाती है। लेन-देन की पहचान में तीन भाग होते हैं
- खंड संख्या को रोलबैक या पूर्ववत करें
- लेन-देन तालिका स्लॉट संख्या
- अनुक्रम या रैप नंबर
XID=usn#.slot#.wrap#
प्रत्येक ब्लॉक आईटीएल में XID होगा
ITL क्लीन-आउट का अर्थ है ITL में XID की तलाश करना और इसके आधार पर रोलबैक सेगमेंट की खोज करना और लेन-देन की सक्रियता की जांच के लिए लेन-देन तालिका और रैप नंबर की तलाश करना।
हम किसी भी रोलबैक सेगमेंट को डंप करने के लिए नीचे दिए गए कमांड का उपयोग कर सकते हैं
सिस्टम डंप को पूर्ववत करें हेडर <खंड का नाम पूर्ववत करें>;
प्रत्येक सक्रिय लेनदेन को v$लेनदेन तालिका में देखा जा सकता है
v$transaction से addr, xidusn, xidslot, xidsqn चुनें;ADDR XIDUSN XIDSLOT XIDSQN -------- ---------- ---------- --- -------3C485875 50 5 3000
लेन-देन पहचानकर्ता (XID) का उपयोग करके स्वयं के सत्र में भी प्राप्त किया जा सकता है
दोहरी से dbms_transaction.local_transaction_id चुनें;
TX enq पर प्रतीक्षा v$session_wait में दिखाई देगी
P1:नाम|मोड
P2:rbs3|रैप#
P3:स्लॉट#
डीएमएल रो लॉक को सारांशित करने के लिए
एक सत्र में पहला डीएमएल जहां कोई लेनदेन पहले से मौजूद नहीं है, परोक्ष रूप से एक लेनदेन तैयार करेगा।
- पूर्ववत करें खंड संख्या, स्लॉट और रैप असाइन किया जाएगा
- TX एनक्यू को तुरंत चालू किया जाएगा
जब संशोधित की जाने वाली पंक्ति की पहचान की जाती है, तो सत्र डेटा ब्लॉक के आईटीएल में एक प्रविष्टि लेगा, इसे लेनदेन के लिए असाइन करेगा
- USN/SLOT/WRAP आईटीएल स्लॉट को लिखा जाएगा, उस स्लॉट को वर्तमान लेनदेन के लिए आरक्षित कर दिया जाएगा
- वर्तमान लेनदेन के आईटीएल स्लॉट को इंगित करने के लिए पंक्ति निर्देशिका में लॉक बाइट सेट करके, पंक्ति पर लॉक लिया जाएगा
TM और TX Enqueue दोनों को V$lock में देखा जा सकता है
- प्रकार TM या TX की पहचान करता है
- आईडी1 और आईडी2 में अतिरिक्त जानकारी हो सकती है, लेकिन एनक्यूई प्रकार के संबंध में संदर्भ-संवेदनशील हैं
- TM एनक्यू के लिए, ID1 लॉक की जा रही वस्तु का OBJECT_ID है, जिसे DBA_OBJECTS में संदर्भित किया जा सकता है, और ID2 हमेशा 0 होता है
- TX Enqueue के लिए, ID1 और ID2 पूर्ववत खंड संख्या, स्लॉट संख्या और रैप को पकड़कर रखें
ओरेकल लॉक के काम करने की व्याख्या करने के लिए विस्तृत उदाहरण
- डमी टेबल बनाएं
dba_objects से चुनें * के रूप में j से तालिका बनाएं जहां rownum <3;तालिका बनाई गई j1 से तालिका बनाएं जैसे चयन करें * dba_objects से जहां rownum <3;तालिका बनाई गई
- सत्र ए
अपडेट के लिए j से * चुनें;
आइए देखें कि v$lock में क्या मौजूद है
SQL> v$mystat से अलग साइड चुनें; SID----------2125एसक्यूएल> चुनें * v$lock से जहां sid=2125;ADDR KADDR सिड TY ID1 ID2 LMODE---------------- --- ---------------------------------------------------------- -----अनुरोध CTIME ब्लॉक---------- ---------- ----------00000006B5D9D0D0 00000006B5D9D148 2125 टेक्सास 21488781 30 44 0
तो हम यहां देखते हैं
DML Oracle टेबल लॉक बनाया गया है
TX(लेन-देन लॉक) बनाया गया है
- चलो सत्र बी शुरू करते हैं
एसक्यूएल>अपडेट के लिए j1 से * चुनें;एसक्यूएल> v$mystat से अलग साइड चुनें; SID----------2302SQL> v$lock से * चुनें जहां sid=2302;ADDR KADDR SID TY ID1 ID2 LMODE-------------- --- ---------------------------------------------------------- -----अनुरोध CTIME ब्लॉक ---------- ---------- ---------- 00000006AF7FF910 00000006AF7FF988 2302 TX 2949148 16884039 60 एफएफ एफएफ :33544 30 10 000000006DC289डी60 0000006 डीसी289डीबी8 2302 एई 15062272 106तो हम यहां देखते हैं
डीएमएल टेबल लॉक बनाया गया है
TX(लेन-देन लॉक) बनाया गया है
आइए अब ऐसा करने का प्रयास करें
अपडेट के लिए j से * चुनें;यह लटका रहेगा
- इस मुद्दे का विश्लेषण करने के लिए एक और सत्र शुरू करें
अगर आपको V$lock में सत्र sid =2032 विवरण दिखाई देता है
v$lock से * चुनें जहां sid=2302;ADDR KADDR SID TY ID1 ID2 LMODE---------------- ------------- -------------------------------------------अनुरोध -------- ---------- ------------------ FFFFFFFF7DA4B360 FFFFFFFF7DA4B3C0 2302 TM 33544 0 30 47 00000000006DC289D60 00000006DC289DB8 2302 AE 150622272 0 40 143 143 040 143 143 0404444444 40 143 2302 TX 2883613 16425600 0 6 7 0 FFFFFFFF7DA4B360 FFFFFFFF7DA4B3C0 2302 टीएम 21488781 0 0
बोल्ड पंक्ति कुछ TX enq पर अनुरोध 6 (अनन्य लॉक) है
अब हम अवरुद्ध सत्र को खोजने के लिए नीचे दी गई क्वेरी का उपयोग कर सकते हैं
चुनें l1.sid, 'IS Blocking', l2.sidfrom v$lock l1, v$lock l2where l1.block =1 and l2.request> 0and l1.id1=l2.id1and l1.id2=l2.id2SID 'ISBLOCKING' SID---------- ------------------------2125 ब्लॉक हो रहा है 2302
लेन-देन बी आगे बढ़ने के लिए अब हम सत्र 2125 को प्रतिबद्ध या रोलबैक कर सकते हैं। हम लॉक जारी करने के लिए नीचे दिए गए आदेश का उपयोग करके सत्र 2125 को समाप्त कर सकते हैं
अल्टर सिस्टम किल सेशन '2125,';
कुछ और अतिरिक्त जानकारी
v$lock में TX लॉक उस पंक्ति की जानकारी नहीं बताता है जहां विवाद मौजूद है। हम प्रश्नों का उपयोग करके उन चीज़ों को देख सकते हैं
नीचे दी गई क्वेरी को उस सत्र से निष्पादित करने की आवश्यकता है जो प्रतीक्षा कर रहा है
एसक्यूएल> सेलेक्ट रो_वेट_ऑब्ज#, रो_वेट_फाइल#, रो_वेट_ब्लॉक#, रो_वेट_रो# वी$सेशन से जहां सिड=2302ROW_WAIT_OBJ# ROW_WAIT_FILE# ROW_WAIT_BLOCK# ROW_WAIT_ROW#--------------- ----- -------------------------------21488781 461 81063 0 चुनें do.object_name,row_wait_obj#, row_wait_file #, row_wait_block#, row_wait_row#,dbms_rowid.rowid_create (1, ROW_WAIT_OBJ#, ROW_WAIT_FILE#, ROW_WAIT_BLOCK#, ROW_WAIT_ROW#) v$sessions से, dba_objects dowhere sid=2302and s। OBJECT_NAME ROW_WAIT_OBJ# ROW_WAIT_FILE# ROW_WAIT_BLOCK# ROW_WAIT_ROW# DBMS_ROWID.ROWID_C------------------------------------ -----------------------------------जे21488781 461 81063 0 एबीआर+स्नाहनाएटीन ए.एस.क्यू. =' एबीआर+SNAHNAAAATynAAA';
संबंधित लेख
Oracle लॉकिंग कैसे काम करता है
Oracle डेटाबेस में सत्र विवरण कैसे प्राप्त करें
महत्वपूर्ण डेटाबेस स्वास्थ्य जांच
ओरेकल ऐप्स डीबीए साक्षात्कार प्रश्न
ओरेकल डेटाबेस में ताले की जांच करने के लिए प्रश्न
ओरेकल डीबीए साक्षात्कार प्रश्न
अनुशंसित पाठ्यक्रम
यदि आप एक कदम और आगे जाना चाहते हैं तो निम्नलिखित कुछ अनुशंसित पाठ्यक्रम हैं जिन्हें आप खरीद सकते हैं
कुछ पाठ्यक्रमों के लिंक नीचे दिए गए हैं
Oracle DBA 11g/12c - जूनियर DBA के लिए डेटाबेस प्रशासन :यह कोर्स उन लोगों के लिए अच्छा है जो जूनियर डीबीए के रूप में शुरुआत कर रहे हैं या ओरेकल डीबीए बनने की इच्छा रखते हैं। यह बैकअप और पुनर्प्राप्ति और सामान्य प्रशासन कार्यों की अच्छी समझ प्रदान करेगा
Oracle डेटाबेस:Oracle 12C R2 RAC व्यवस्थापन :इस पाठ्यक्रम में Oracle RAC की स्थापना, व्यवस्थापन शामिल है। Oracle DBA के लिए एक अच्छा कोर्स जो Oracle RAC के लिए अपने कौशल का उन्नयन करना चाहते हैं
Oracle Data Guard:Oracle 12C R2 के लिए डेटाबेस प्रशासन :इस पाठ्यक्रम में Oracle डाटागार्ड की स्थापना, व्यवस्थापन शामिल है। Oracle DBA के लिए एक अच्छा कोर्स जो Oracle Dataguard के लिए अपने कौशल का उन्नयन करना चाहते हैं