स्वायत्त लेनदेन Oracle PL/SQL: कमिट, रोलबैक
PL/SQL में TCL स्टेटमेंट क्या हैं?
TCL का मतलब है ट्रांजेक्शन कंट्रोल स्टेटमेंट। यह या तो लंबित ट्रांजेक्शन को सेव करेगा या लंबित ट्रांजेक्शन को वापस रोल करेगा। ये स्टेटमेंट महत्वपूर्ण भूमिका निभाते हैं क्योंकि जब तक ट्रांजेक्शन सेव नहीं किया जाता है, तब तक DML स्टेटमेंट के ज़रिए किए गए बदलाव डेटाबेस में सेव नहीं होंगे। नीचे अलग-अलग TCL स्टेटमेंट दिए गए हैं।
| COMMIT | सभी लंबित लेनदेन को सहेजता है |
| रोलबैक | सभी लंबित लेनदेन त्यागें |
| पॉइंट सहेजें | लेन-देन में एक बिंदु बनाता है जहां तक बाद में रोलबैक किया जा सकता है |
| रोलबैक टू | निर्दिष्ट समय तक सभी लंबित लेनदेन त्यागें |
लेन-देन निम्नलिखित परिदृश्यों में पूरा होगा।
- जब उपरोक्त में से कोई भी कथन जारी किया जाता है (SAVEPOINT को छोड़कर)
- जब DDL कथन जारी किये जाते हैं। (DDL ऑटो-कमिट कथन होते हैं)
- जब DCL कथन जारी किए जाते हैं। (DCL ऑटो-कमिट कथन होते हैं)
स्वायत्त लेनदेन क्या है?
PL/SQL में, डेटा पर किए गए सभी संशोधनों को ट्रांजेक्शन कहा जाएगा। जब सेव/डिस्कार्ड लागू किया जाता है, तो ट्रांजेक्शन को पूरा माना जाता है। यदि कोई सेव/डिस्कार्ड नहीं दिया जाता है, तो ट्रांजेक्शन को पूरा नहीं माना जाएगा और डेटा पर किए गए संशोधन सर्वर पर स्थायी नहीं होंगे।
सत्र के दौरान किये गये कुछ संशोधनों के बावजूद, PL / SQL संपूर्ण संशोधन को एक ही लेनदेन के रूप में माना जाएगा और इस लेनदेन को सहेजने/छोड़ने से उस सत्र में सभी लंबित परिवर्तन प्रभावित होंगे। स्वायत्त लेनदेन डेवलपर को एक कार्यक्षमता प्रदान करता है जिसमें यह एक अलग लेनदेन में परिवर्तन करने और मुख्य सत्र लेनदेन को प्रभावित किए बिना उस विशेष लेनदेन को सहेजने/छोड़ने की अनुमति देता है।
- इस स्वायत्त लेनदेन को उपप्रोग्राम स्तर पर निर्दिष्ट किया जा सकता है।
- किसी भी उपप्रोग्राम को किसी भिन्न लेनदेन में कार्य करने के लिए, उस ब्लॉक के घोषणात्मक अनुभाग में 'PRAGMA AUTONOMOUS_TRANSATION' कीवर्ड दिया जाना चाहिए।
- यह संकलक को निर्देश देगा कि इसे अलग लेनदेन के रूप में माना जाए तथा इस ब्लॉक के अंदर सहेजना/छोड़ना मुख्य लेनदेन में प्रतिबिंबित नहीं होगा।
- इस स्वायत्त लेनदेन से मुख्य लेनदेन पर जाने से पहले COMMIT या ROLLBACK जारी करना अनिवार्य है क्योंकि किसी भी समय केवल एक ही लेनदेन सक्रिय हो सकता है।
- इसलिए एक बार जब हम स्वायत्त लेनदेन कर लेते हैं तो हमें उसे सहेजना होता है और लेनदेन पूरा करना होता है, उसके बाद ही हम मुख्य लेनदेन पर वापस जा सकते हैं।
सिंटेक्स:
DECLARE PRAGMA AUTONOMOUS_TRANSACTION; . BEGIN <executin_part> [COMMIT|ROLLBACK] END; /
- उपरोक्त सिंटैक्स में, ब्लॉक को एक स्वायत्त लेनदेन के रूप में बनाया गया है।
उदाहरण 1इस उदाहरण में, हम यह समझने जा रहे हैं कि स्वायत्त लेनदेन कैसे काम करता है।
DECLARE
l_salary NUMBER;
PROCEDURE nested_block IS
PRAGMA autonomous_transaction;
BEGIN
UPDATE emp
SET salary = salary + 15000
WHERE emp_no = 1002;
COMMIT;
END;
BEGIN
SELECT salary INTO l_salary FROM emp WHERE emp_no = 1001;
dbms_output.put_line('Before Salary of 1001 is'|| l_salary);
SELECT salary INTO l_salary FROM emp WHERE emp_no = 1002;
dbms_output.put_line('Before Salary of 1002 is'|| l_salary);
UPDATE emp
SET salary = salary + 5000
WHERE emp_no = 1001;
nested_block;
ROLLBACK;
SELECT salary INTO l_salary FROM emp WHERE emp_no = 1001;
dbms_output.put_line('After Salary of 1001 is'|| l_salary);
SELECT salary INTO l_salary FROM emp WHERE emp_no = 1002;
dbms_output.put_line('After Salary of 1002 is '|| l_salary);
end;
उत्पादन
Before:Salary of 1001 is 15000 Before:Salary of 1002 is 10000 After:Salary of 1001 is 15000 After:Salary of 1002 is 25000
कोड स्पष्टीकरण:
- कोड लाइन 2: l_salary को NUMBER के रूप में घोषित करना.
- कोड लाइन 3: नेस्टेड_ब्लॉक प्रक्रिया घोषित करना
- कोड लाइन 4: नेस्टेड_ब्लॉक प्रक्रिया को 'AUTONOMOUS_TRANSACTION' के रूप में बनाया जा रहा है।
- कोड पंक्ति 7-9: कर्मचारी संख्या 1002 के वेतन में 15000 की वृद्धि की गई।
- कोड पंक्ति 10: लेन-देन का कार्य सम्पन्न करना।
- कोड पंक्ति 13-16: परिवर्तन से पहले कर्मचारी 1001 और 1002 के वेतन विवरण का मुद्रण।
- कोड पंक्ति 17-19: कर्मचारी संख्या 1001 के वेतन में 5000 की वृद्धि की गई।
- कोड पंक्ति 20: नेस्टेड_ब्लॉक प्रक्रिया को कॉल करना;
- कोड पंक्ति 21: मुख्य लेनदेन को त्यागना.
- कोड पंक्ति 22-25: परिवर्तन के बाद कर्मचारी 1001 और 1002 के वेतन विवरण का मुद्रण।
- कर्मचारी संख्या 1001 के लिए वेतन वृद्धि परिलक्षित नहीं होती है क्योंकि मुख्य लेनदेन को त्याग दिया गया है। कर्मचारी संख्या 1002 के लिए वेतन वृद्धि परिलक्षित होती है क्योंकि उस ब्लॉक को एक अलग लेनदेन के रूप में बनाया गया है और अंत में सहेजा गया है।
- अतः मुख्य लेनदेन में सहेजे/छोड़े जाने के बावजूद, स्वायत्त लेनदेन में परिवर्तन मुख्य लेनदेन परिवर्तनों को प्रभावित किए बिना सहेजे गए हैं।

