PostgreSQL में BEGIN, COMMIT और ROLLBACK कैसे एकल संचालन में कई परिवर्तनों को जोड़ते हैं
PostgreSQL में लेन-देन (transactions) SQL संचालनों को एकमात्र ब्लॉक में समूहित करने की अनुमति देते हैं, जिसके लिए BEGIN, COMMIT और ROLLBACK कमांड का उपयोग किया जाता है। यह डेटा पूर्णता की गारंटी देता है: या तो सभी परिवर्तन लागू होंगे या एक भी नहीं। इस तंत्र का आधार ACID सिद्धांतों - परमाणुता, संगतता, अलगाव और टिकाऊता पर है।
इस पृष्ठ पर
संक्षिप्त उत्तर
PostgreSQL में BEGIN, COMMIT और ROLLBACK कमांड एक लेन-देन ब्लॉक का प्रबंधन करते हैं जो कई संचालनों को एक एकल तार्किक इकाई में समूहित करता है। जब BEGIN का निष्पादन होता है, तो लेन-देन शुरू होता है; उसके बाद के परिवर्तन तुरंत समर्थित नहीं होते। यदि COMMIT का निष्पादन होता है, तो सभी परिवर्तन स्थायी रूप से सहेजे जाते हैं। यदि ROLLBACK का निष्पादन होता है, तो BEGIN के बाद से सभी परिवर्तन रद्द कर दिए जाते हैं। यह परमाणुता की गारंटी देता है - या तो सभी चरण सफल होंगे, या कोई भी डेटाबेस को प्रभावित नहीं करेगा।
PostgreSQL में लेन-देन का परिचय
लेन-देन विश्वसनीय डेटाबेस संचालनों के लिए मूलभूत हैं। वे कई SQL कथनों को एक एकल तार्किक इकाई में समूहित करने की अनुमति देते हैं जो 'सभी या कोई नहीं' के रूप में कार्य करती है। यह डेटा पूर्णता बनाए रखने के लिए आवश्यक है, विशेष रूप से उन प्रणालियों में जहाँ त्रुटियाँ असंगत अवस्थाओं के कारण बन सकती हैं, जैसे बैंकिंग ट्रांसफर।
PostgreSQL ACID सिद्धांतों - परमाणुता, संगतता, अलगाव और टिकाऊता के अनुसार लेन-देन का निर्माण करता है। जैसा कि दस्तावेज़ में कहा गया है, 'एक लेन-देन कई चरणों को एक अविभाज्य संचालन में समूहित करता है' - यदि कोई विफलता होती है, तो डेटाबेस में कोई अंतरिम परिवर्तन नहीं रहता।
BEGIN, COMMIT और ROLLBACK की व्याकरण
एक लेन-देन का विशिष्ट प्रबंधन करने के लिए तीन कमांड का उपयोग किया जाता है: BEGIN, COMMIT और ROLLBACK। BEGIN एक लेन-देन ब्लॉक की शुरुआत करता है। इसके बाद के सभी संचालन इस लेन-देन के भीतर निष्पादित होते हैं। COMMIT सभी परिवर्तन स्थायी बनाता है। ROLLBACK BEGIN के बाद से किए गए सभी परिवर्तन को रद्द कर देता है।
उदाहरण: एलिस से बॉब को $100 ट्रांसफर करना एक एकल लेन-देन के रूप में किया जाता है:
इस उदाहरण ट्रांसफर में एक accounts टेबल की धारणा है जिसमें एक अद्वितीय नाम और एक संख्यात्मक बैलेंस है, और एलिस और बॉब के लिए मौजूद पंक्तियाँ हैं। सेवापॉइंट उदाहरण में अतिरिक्त वॉली पंक्ति की धारणा है। कथनों को नियंत्रित प्रदर्शन डेटाबेस में चलाएं। अनुप्रयोग कोड में, प्रभावित पंक्ति की संख्या, पर्याप्त धन और आवश्यक प्रतिबंधों की सत्यापन करें; सफल COMMIT ही इस बात की गारंटी नहीं देता कि वांछित व्यावसायिक ट्रांसफर हुआ।
BEGIN;
UPDATE accounts SET balance = balance - 100.00 WHERE name = 'Alice';
UPDATE accounts SET balance = balance + 100.00 WHERE name = 'Bob';
COMMIT;परिवर्तनों की परमाणुता
परमाणुता का अर्थ है कि एक लेन-देन या तो पूरी तरह से सफल होता है या पूरी तरह रद्द हो जाता है। अंतरिम अवस्थाएँ संरक्षित नहीं होतीं। उदाहरण के लिए, यदि एलिस के खाते से धन निकाला जाता है लेकिन बॉब को जमा करने से पहले विफलता हो जाती है, तो पूरा लेन-देन रद्द कर दिया जाता है और एलिस का बैलेंस पुनर्स्थापित हो जाता है।
WAL रिकॉर्ड्स डेटा पेजों के लिए टिकाऊ स्टोरेज में पहुंचने से पहले लिखे जाते हैं। डेटा पेज अक्सर COMMIT से पहले लिखे जा सकते हैं; परमाणुता का अर्थ यह नहीं है कि परिवर्तन स्मृति में रहते हैं जब तक कि COMMIT नहीं होता। दुर्घटना पुनर्स्थापना लॉग का उपयोग करती है, जबकि दृश्यता नियम अन्य सत्रों को अनसमर्थित टेबल परिवर्तन दिखाने से रोकते हैं।
प्राथमिक रूप से स्वचालित लेन-देन
एक विशिष्ट लेन-देन ब्लॉक के बाहर, PostgreSQL प्रत्येक कथन को अपने अनुक्रमित लेन-देन में निष्पादित करता है। क्लाइंट लाइब्रेरी स्वचालित रूप से एक लेन-देन शुरू कर सकती है या autocommit विकल्प को उपलब्ध करा सकती है, इसलिए दो कथनों की स्वतंत्रता के लिए अनुमान लगाने से पहले कनेक्शन सेटिंग्स की जाँच करें।
यह ढंग सरल संचालनों के लिए उपयोगी है, लेकिन जब कई कमांडों को संगत रूप से निष्पादित करना होता है, तो विशिष्ट BEGIN और COMMIT की आवश्यकता होती है ताकि आंशिक परिवर्तनों के लागू होने से बचा जा सके।
त्रुटि प्रबंधन: परिवर्तनों को वापस लेना
यदि एक लेन-देन के दौरान कोई शर्त आती है जो इसे अमान्य बना दे (जैसे ऋणात्मक बैलेंस), तो ROLLBACK जारी किया जा सकता है। लेन-देन की शुरुआत से लेकर अब तक के सभी परिवर्तन वापस ले लिए जाते हैं।
उदाहरण के लिए, यदि एलिस से धन निकालने के बाद उसका बैलेंस ऋणात्मक हो जाता है, तो लेन-देन वापस ले लिया जा सकता है, जिससे डेटाबेस की मूल स्थिति वापस आ जाती है।
अन्य लेन-देनों के लिए परिवर्तनों की दृश्यता
एक लेन-देन के भीतर किए गए परिवर्तन COMMIT के पहले अन्य सत्रों के लिए दिखाई नहीं देते। यह अलगाव (isolation) सुनिश्चित करता है। अन्य उपयोगकर्ता तालिकाओं की पिछली स्थिति को ही देखते रहते हैं।
COMMIT के बाद ही सभी परिवर्तन एक साथ दिखाई देते हैं, जिससे ऐसी स्थिति नहीं बन सकती कि एक ऑपरेशन का एक हिस्सा (जैसे निकासी) दिखाई दे जबकि दूसरा हिस्सा (जैसे जमा) नहीं।
लेन-देन अलगाव स्तर
SQL में चार नाम हैं: Read Uncommitted, Read Committed, Repeatable Read और Serializable। PostgreSQL Read Uncommitted को Read Committed की तरह लेता है, इसलिए चार नाम तीन अलग-अलग व्यवहार प्रदान करते हैं। Read Committed आमतौर पर पूर्वनिर्धारित होता है; यह सत्र या डेटाबेस कॉन्फ़िगरेशन द्वारा बदला जा सकता है।
Read Committed केवल उन डेटा को दिखाता है जो प्रश्न शुरू होने से पहले कमिट किए गए थे। Repeatable Read लेन-देन की शुरुआत पर एक संगत स्नैपशॉट प्रदान करता है। Serializable क्रमिक निष्पादन की नकल करता है लेकिन सीरियलाइजेशन त्रुटियों का संभावना हो सकती है।
SAVEPOINT का उपयोग भागीय वापसी के लिए
SAVEPOINT एक लेन-देन के भीतर एक बिंदु बनाता है जहाँ आप वापस ले सकते हैं बिना पूरे लेन-देन को रद्द किए। यह जटिल तर्क में उपयोगी होता है जहाँ केवल ऑपरेशन का केवल एक हिस्सा वापस लेना होता है।
उदाहरण के लिए, यदि बॉब को पैसा भेजने के बाद पता चलता है कि वॉली को ही भेजना चाहिए था, तो लेन-देन को एक SAVEPOINT पर वापस ले जा सकते हैं और पैसा वॉली को भेज सकते हैं।
BEGIN;
UPDATE accounts SET balance = balance - 100.00 WHERE name = 'Alice';
SAVEPOINT my_savepoint;
UPDATE accounts SET balance = balance + 100.00 WHERE name = 'Bob';
ROLLBACK TO my_savepoint;
UPDATE accounts SET balance = balance + 100.00 WHERE name = 'Wally';
COMMIT;क्या जाँचें
- BEGIN जारी करने से पहले क्लाइंट लेन-देन और autocommit सेटिंग्स की जाँच करें।
- बैलेंस और प्रभावित पंक्ति की संख्या की सत्यापन करें; परमाणुता ही व्यवसायिक सहीता की गारंटी नहीं देती।
- कथित विफलता के बाद, कनेक्शन का पुनर्उपयोग करने से पहले ROLLBACK जारी करें।
- लेन-देन को छोटा रखें और अनुप्रयोग नीति के अनुसार सीरियलाइजेशन विफलताओं को पुनर्निर्माण करें।
उपयोग की सीमाएँ
अनुक्रमों (sequences) में किए गए परिवर्तन ROLLBACK के दौरान रद्द नहीं होते और अन्य लेन-देनों के लिए तुरंत दिखाई देते हैं। उच्च अलगाव स्तर अक्सर सीरियलाइजेशन त्रुटियों का कारण बन सकते हैं, जिसके कारण लेन-देन को पुनर्निर्माण करना आवश्यक हो सकता है।