किस मामले में हमें कर्सर में for update nowait
का उपयोग करने की आवश्यकता है।कर्सर में 'अपडेट के लिए अभी अपडेट' का उपयोग कब करना चाहिए?
उत्तर
for update nowait
का उपयोग करके पंक्तियां व्यस्त रहेंगी और एक प्रतिबद्ध या रोलबैक निष्पादित होने तक लॉक प्राप्त होगा। लॉक प्राप्त करने का प्रयास करने वाला कोई भी अन्य सत्र ORA-00054: resource busy and acquire with NOWAIT specified or timeout expired instead of waiting the lock to release
जैसे ओरेकल त्रुटि संदेश प्राप्त करेगा।
Session1:
CURSOR abc_cur
IS
select * from dept where deptno =10 for update nowait;
यहाँ पंक्तियों बंद हैं जब तक कर्सर बंद कर दिया है या एक प्रतिबद्ध/रोलबैक मार डाला जाता है।
सत्र 2: के रूप में नीचे दिखाया गया हैं, इस बीच, सत्र 2 से किसी अन्य उपयोगकर्ता एक ही रिकॉर्ड का उपयोग करने की कोशिश करता है तो यह एक त्रुटि फेंक होगा
select * from dept where deptno =10 for update nowait;
इस उपयोगकर्ता को अपडेट भी नहीं कर सकते हैं या एक ही रिकॉर्ड हटाएं जो पहले सत्र द्वारा बंद कर दिया गया है।
ERROR at line 1:
`ORA-00054: resource busy and acquire with NOWAIT specified or timeout expired`
उपयोग: अब अगर आप रिकॉर्ड के कुछ सेट पर कुछ हेरफेर करना चाहते हैं और आप तो अपने डेटा को ओवरराइड करने के लिए आपको सबसे पहले रिकॉर्ड लॉक कर देना चाहिए एक और सत्र से किसी अन्य उपयोगकर्ता नहीं करना चाहते (for update nowait
का उपयोग कर) और फिर अपने हेरफेर करते हैं। आपके मैनिपुलेशन के साथ करने के बाद, कर्सर को बंद करें और प्रतिबद्ध करें।
संपादित मेरी सत्र 1 में मान लीजिए मैं निष्पादित निम्न स्क्रिप्ट:
declare
cursor abc is select * from temp ;
temp abc%rowtype;
begin
open abc;
end;
अब सत्र 2 में मैं निष्पादित
select * from temp ;
0 rows found
अगर मैं एक ही स्क्रिप्ट फिर से अमल
declare
cursor abc is select * from temp ;
temp abc%rowtype;
begin
open abc;
end;
तब मुझेमिलते हैं
तो अगर मैं कोई इंतजार नहीं करता हूं तो मैं अन्य सत्र से एक ही पंक्ति को भी प्राप्त नहीं कर सकता हूं, क्या मैं सही हूँ? – user1
अगर मैं एक और सत्र से एक ही पंक्ति को अपडेट नहीं करना चाहता हूं, तो मुझे कैसे संभालना चाहिए? – user1
@ उपयोगकर्ता 1: हाँ आप दूसरे सत्र से एक ही पंक्ति का चयन कर सकते हैं, लेकिन यदि आप किसी अन्य सत्र द्वारा लॉक किया गया है, तो आप उसी पंक्ति को लॉक नहीं कर सकते हैं। हाँ, आप अन्य सत्रों से पंक्तियां प्राप्त कर सकते हैं। –