2012-08-10 19 views
5

मैं EMPLOYEES तालिका वेतन कॉलम अपडेट करने के लिए पीएल/एसक्यूएल (ओरेकल 11 जी) का उपयोग कर रहा हूं।अद्यतन अद्यतन के लिए उपयोग

मैंने वही काम करने के लिए दो अलग-अलग स्क्रिप्ट का उपयोग किया है, मैं कर्मचारियों के वेतन को अद्यतन करता हूं।

एक स्क्रिप्ट FOR UPDATE OF कथन का उपयोग करती है जहां एक और स्क्रिप्ट इसका उपयोग नहीं करती है। दोनों मामलों में मैंने पाया कि ओरेकल पंक्ति स्तर ताले रखता है जब तक हम ROLLBACK या COMMIT आदेश निष्पादित नहीं करते हैं।

फिर दो स्क्रिप्ट के बीच क्या अंतर है?

कौन सा उपयोग करने के लिए बेहतर है?

यहाँ दो स्क्रिप्ट के बारे में मैं बात कर रहा हूँ कर रहे हैं:

-- Script 1: Uses FOR UPDATE OF 

declare 
cursor cur_emp 
is 
select employee_id,department_id from employees where department_id = 90 for update of salary; 
begin 
    for rec in cur_emp 
    loop 
    update Employees 
    set salary = salary*10 
    where current of cur_emp; 
    end loop; 
end; 


--Script 2: Does the same thing like script 1 but FOR UPDATE OF is not used here 

declare 
cursor cur_emp 
is 
select employee_id,department_id from employees where department_id = 90; 
begin 
    for rec in cur_emp 
    loop 
    update Employees 
    set salary = salary*10 
    where Employee_ID = rec.employee_id; 
    end loop; 
end; 

मैंने पाया कि ओरेकल दोनों ही मामलों पर पंक्ति स्तर ताले हासिल कर ली। तो, FOR UPDATE OF का उपयोग करने का क्या फायदा है और कोडिंग का बेहतर तरीका कौन सा है?

+2

भूलें: अगर कर्मचारी == एमआरपी फिर वेतन निर्धारित करें + = 100000 – stark

उत्तर

12

जब आप FOR UPDATE निर्दिष्ट करते हैं, तो पंक्ति उस बिंदु पर लॉक होती है जब आप SELECT डेटा को लॉक करते हैं। FOR UPDATE के बिना, पंक्ति को UPDATE पंक्ति पर लॉक किया गया है। दूसरी लिपि में, एक और सत्र संभावित रूप से उस समय के बीच पंक्ति को लॉक कर सकता था जब SELECT निष्पादित किया गया था और जिस बिंदु पर आपने UPDATE पर प्रयास किया था।

यदि आप SELECT कथन से निपट रहे हैं जो अपेक्षाकृत कुछ पंक्तियों और एक तंग आंतरिक लूप लौटाता है, तो यह संभावना नहीं है कि दोनों के बीच एक सराहनीय अंतर होगा। SELECT पर FOR UPDATE जोड़ने से आपको टाइमआउट क्लॉज जोड़ने का मौका भी मिलता है यदि आप नहीं चाहते हैं कि आपकी स्क्रिप्ट अनिश्चित काल तक अवरुद्ध हो, यदि कुछ अन्य सत्र में उस पंक्ति में से एक होता है जिसे आप लॉक करने का प्रयास कर रहे हैं।

+0

'अद्यतन के लिए' स्क्रिप्ट तेजी से नहीं चलती है क्योंकि यह 'वर्तमान स्थिति' खंड में 'ROWID' के माध्यम से अद्यतन को प्रभावी ढंग से एक्सेस कर रहा है? – Ollie

+2

@ ओली - संभव। लेकिन 'SELECT' को पहली पंक्ति लौटने से पहले लॉक विशेषता सेट करने के लिए प्रत्येक पंक्ति पर जाना होगा ताकि इसमें प्रत्येक पंक्ति को दूसरी बार मारना शामिल हो (हालांकि दूसरी हिट कैश्ड ऑब्जेक्ट पर होने की संभावना है)। मैं उम्मीद करता हूं कि दोनों एक-दूसरे को ऑफसेट करें। इसके अलावा, यदि लक्ष्य गति को अधिकतम करना है, तो आप पंक्ति-दर-पंक्ति कर्सर 'FOR' लूप की बजाय एक' UPDATE' कथन या कम से कम पीएल/एसक्यूएल थोक संचालन लिखेंगे। –