MySQL SQL क्वेरी को हैंडल करने के लिए विभिन्न डेटाबेस इंजन प्रदान करता है। सबसे लोकप्रिय इंजन MyISAM और InnoDB हैं। इन दो इंजनों में से, InnoDB लेनदेन का समर्थन करता है, जिसका अर्थ है कि हम एक इकाई के रूप में कई प्रश्नों को शामिल करते हुए एक ऑपरेशन करने के लिए प्रतिबद्ध और रोलबैक कर सकते हैं। माईसाम के साथ ऐसा संभव नहीं है क्योंकि यह लेनदेन का समर्थन नहीं करता है। MyISAM की तुलना में InnoDB अधिक विश्वसनीय है क्योंकि यह ऑटो-रिकवरी के लिए ट्रांजेक्शनल लॉग का उपयोग करता है।
नोट :MySQL MyISAM को पूरी तरह से हटाने की योजना बना रहा है क्योंकि MyISAM की तुलना में InnoDB प्रदर्शन में काफी बेहतर है।
यह ट्यूटोरियल START TRANSACTION, COMMIT . का उपयोग करके MySQL में लेनदेन को संभालने के लिए विवरण प्रदान करता है , और रोलबैक बयान। यद्यपि हम SQL प्रश्नों को अलग से निष्पादित कर सकते हैं जो कि आदर्श परिदृश्य है, कई मामलों में हमें यह सुनिश्चित करने की आवश्यकता है कि किसी कार्य के लिए विशिष्ट सभी प्रश्न या तो सफल हों या किसी भी क्वेरी की विफलता के कारण विफल हों। हम ऐसे कार्यों को एक एकल इकाई के रूप में मान सकते हैं जिसमें पंक्तियों को बनाने, अद्यतन करने या हटाने के लिए कई ऑपरेशन या क्वेरी शामिल हैं। इसलिए, एक से अधिक संचालन वाली एक लेन-देन इकाई में, इसे या तो सफल होना चाहिए या असफल होना चाहिए।
लेन-देन को संभालते समय सावधानी बरतनी चाहिए क्योंकि कुछ कथन ऐसे होते हैं जिन्हें वापस नहीं लिया जा सकता है। इनमें CREATE/DROP डेटाबेस, CREATE/ALTER/DROP टेबल या स्टोर किए गए रूटीन शामिल हैं।
लेन-देन के गुण
नीचे सूचीबद्ध लेनदेन के चार मानक गुण हैं। इन्हें ACID . भी कहा जाता है ।
परमाणुता - यह सुनिश्चित करता है कि किसी कार्य या इकाई में शामिल सभी कार्यों को सफलतापूर्वक पूरा किया जाए। किसी भी ऑपरेशन की विफलता के मामले में, लेन-देन को रद्द कर दिया जाना चाहिए और पिछले सभी कार्यों को उनकी पूर्व स्थिति में वापस लाया जाना चाहिए। इसका मतलब है कि लेन-देन के विफल होने की स्थिति में, इसमें शामिल कोई भी ऑपरेशन सफल नहीं होना चाहिए।
संगति - डेटा लेनदेन की शुरुआत और अंत में एक सुसंगत स्थिति में होना चाहिए ताकि यह सुनिश्चित हो सके कि डेटाबेस सफलतापूर्वक प्रतिबद्ध लेनदेन पर परिवर्तनों को प्रतिबिंबित करने के लिए राज्यों को बदलता है।
अलगाव - अन्य लेन-देन के साथ मध्यवर्ती राज्यों को छिपाते हुए लेनदेन को अलगाव में पूरा किया जाना चाहिए। प्रत्येक लेन-देन एक दूसरे के लिए स्वतंत्र और पारदर्शी रूप से संचालित होना चाहिए।
स्थायित्व - यह सुनिश्चित करता है कि लेन-देन के हिस्से के रूप में डेटा में परिवर्तन सिस्टम की विफलता के मामले में भी बना रहता है। सिस्टम के विफल होने की स्थिति में भी परिवर्तनों को पूर्ववत नहीं किया जाना चाहिए।
लेन-देन विवरण
लेनदेन शुरू करें - हम लेनदेन प्रारंभ करें . का उपयोग कर सकते हैं या BEGIN या काम शुरू करें लेनदेन शुरू करने के लिए। शुरुआत या काम शुरू करें START TRANSACTION. . के उपनाम हैं
प्रतिबद्ध करें - सफलता के मामले में, COMMIT परिवर्तन जारी रखने के लिए लेनदेन के अंत में आदेश जारी किया जाना चाहिए।
रोलबैक - किसी भी विफलता के मामले में, रोलबैक राज्यों को बहाल करने के लिए आदेश जारी किया जाना चाहिए जैसे कि लेनदेन शुरू करने से पहले।
स्वचालित रूप से सेट करें - कथन का प्रयोग करें स्वचालित रूप से सेट करें लेन-देन की शुरुआत में ऑटो-प्रतिबद्धता को अक्षम करने और लेनदेन के अंत में इसे सक्षम करने के लिए। केवल लेनदेन प्रारंभ करें . के मामले में उपयोग करें या BEGIN या काम शुरू करें लेन-देन को संभालने के लिए उपयोग नहीं किया जाता है।
धन हस्तांतरण उदाहरण
मैं इंट्रा-बैंक मनी ट्रांसफर उदाहरण का उपयोग करके लेनदेन की व्याख्या करूंगा जिसमें एक निश्चित राशि को उसी बैंक के एक खाते से दूसरे खाते में स्थानांतरित किया जाना है।
नोट :यह उदाहरण सिर्फ प्रदर्शन के उद्देश्य से है और वास्तविक परिदृश्य निश्चित रूप से बैंकिंग नियमों के आधार पर अलग होगा। यह भी मानता है कि लेन-देन संबंधी प्रश्नों को प्रोग्रामिक रूप से हैंडल किया जाता है और मध्यवर्ती मान उपयुक्त चर में संग्रहीत होते हैं।
हस्तांतरण करने के लिए संचालन का क्रम इस प्रकार है:
- अनुरोध से डेबिट और क्रेडिट ग्राहक आईडी प्राप्त करें और वेरिएबल में स्टोर करें।
- अनुरोध से हस्तांतरित की जाने वाली राशि प्राप्त करें और एक चर में संग्रहीत करें।
- लेन-देन शुरू करें।
- पहले ग्राहक का बैलेंस प्राप्त करें और एक वैरिएबल में स्टोर करें।
- दूसरे ग्राहक का बैलेंस प्राप्त करें और एक वैरिएबल में स्टोर करें।
- पहले ग्राहक के पास अपर्याप्त शेष होने की स्थिति में लेन-देन को वापस ले लें।
- पहले ग्राहक खाते से कटौती को दर्शाने के लिए एक डेबिट लेनदेन जोड़ें।
- विफलता के मामले में रोलबैक।
- दूसरे ग्राहक खाते में स्थानांतरण को दर्शाने के लिए एक क्रेडिट लेनदेन जोड़ें।
- विफलता के मामले में रोलबैक।
- ट्रांसफर रिकॉर्ड करें।
- विफलता के मामले में रोलबैक।
- पहले ग्राहक का बैलेंस अपडेट करें।
- विफलता के मामले में रोलबैक।
- दूसरे ग्राहक की शेष राशि अपडेट करें।
- विफलता के मामले में रोलबैक।
- लेन-देन करें।
स्थानांतरण अनुक्रम को निष्पादित करने के लिए नीचे दिए गए नमूना प्रश्न हैं।
-- Start the transaction
START TRANSACTION;
-- Get balance of first customer
SELECT balance from ACCOUNT WHERE customer_id = 123124123;
-- Get balance of second customer
SELECT balance from ACCOUNT WHERE customer_id = 223124145;
-- Rollback in case of insufficient funds
ROLLBACK;
-- Add debit transaction
INSERT INTO transaction(customer_id,amount,type,reference) VALUES(123124123, <amount>, 0, <reference>);
-- Rollback in case of failure
ROLLBACK;
-- Add credit transaction
INSERT INTO transaction(customer_id,amount,type,reference) VALUES(223124145, <amount>, 1, <reference>);
-- Rollback in case of failure
ROLLBACK;
-- Add transfer transaction
INSERT INTO transfer(from,to,amount) VALUES(123124123, 223124145, <amount>);
-- Rollback in case of failure
ROLLBACK;
-- Update balance of first customer
UPDATE ACCOUNT SET balance = <balance - amount> WHERE customer_id = 123124123;
-- Rollback in case of failure
ROLLBACK;
-- Update balance of second customer
UPDATE ACCOUNT SET balance = <balance + amount> WHERE customer_id = 223124145;
-- Rollback in case of failure
ROLLBACK;
-- Commit the transaction
COMMIT;
हम स्पष्ट रूप से देख सकते हैं कि दोनों ग्राहकों के वास्तविक शेष को दर्शाने के लिए स्थानांतरण शुरू करने से पहले किसी भी स्तर पर वापस प्रारंभिक अवस्था में वापस आने में विफलता के मामले में हमें रोलबैक करना चाहिए।
इस प्रकार हम MySQL में लेनदेन को संभाल सकते हैं।