SQL में लेनदेन निष्पादन की एक इकाई है जो एक या अधिक कार्यों को एक साथ समूहित करता है। एक लेन-देन सफल माना जाता है यदि उसके भीतर के सभी कार्यों को बिना त्रुटि के निष्पादित किया जाता है।
हालांकि, यदि लेन-देन में कोई भी कार्य निष्पादित करने में विफल रहता है, तो संपूर्ण लेनदेन विफल हो जाता है। एक लेन-देन के केवल दो परिणाम होते हैं:सफल या असफल।
एक व्यावहारिक परिदृश्य
एटीएम (ऑटोमेटेड टेलर मशीन) के व्यावहारिक उदाहरण पर विचार करें। आप एटीएम में जाते हैं और यह आपका कार्ड मांगता है। यह यह जांचने के लिए एक क्वेरी चलाता है कि कार्ड वैध है या नहीं। इसके बाद, यह आपसे आपका पिन कोड मांगता है। फिर से यह पिन कोड से मिलान करने के लिए एक क्वेरी चलाता है। फिर एटीएम आपसे वह राशि मांगता है जिसे आप निकालना चाहते हैं और आप वह राशि दर्ज करते हैं जो आप चाहते हैं। एटीएम आपके खाते से उस राशि को काटने के लिए एक अन्य क्वेरी निष्पादित करता है और फिर आपको धनराशि वितरित करता है।
क्या होगा यदि राशि आपके खाते से काट ली जाती है और फिर सिस्टम बिना नोट बांटे बिजली की विफलता के कारण क्रैश हो जाता है?
यह समस्याग्रस्त है क्योंकि ग्राहक के पास कोई पैसा प्राप्त किए बिना ही धनराशि काट ली गई है। यह वह जगह है जहाँ लेनदेन आसान हो सकता है।
सिस्टम क्रैश या किसी अन्य त्रुटि के मामले में, लेन-देन के सभी कार्यों को वापस ले लिया जाता है। इसलिए, एटीएम के मामले में, यदि आप किसी भी कारण से इसे निकालने में असमर्थ हैं, तो राशि आपके खाते में वापस जोड़ दी जाएगी।
लेन-देन क्या है?
सबसे सरल रूप में, डेटाबेस तालिका में परिवर्तन एक लेनदेन है। इसलिए, INSERT, UPDATE और DELETE स्टेटमेंट सभी ट्रांजेक्शन स्टेटमेंट हैं। जब आप कोई प्रश्न लिखते हैं, तो लेन-देन किया जाता है। हालाँकि, इस लेन-देन को उलट नहीं किया जा सकता है। हम देखेंगे कि लेन-देन कैसे बनाए जाते हैं, प्रतिबद्ध होते हैं और नीचे लुढ़क जाते हैं लेकिन पहले काम करने के लिए कुछ डमी डेटा बनाते हैं।
डेटा तैयार करना
निम्न स्क्रिप्ट को अपने डेटाबेस सर्वर पर चलाएँ।
CREATE DATABASE schooldb CREATE TABLE student ( id INT PRIMARY KEY, name VARCHAR(50) NOT NULL, gender VARCHAR(50) NOT NULL, age INT NOT NULL, total_score INT NOT NULL, ) INSERT INTO student VALUES (1, 'Jolly', 'Female', 20, 500), (2, 'Jon', 'Male', 22, 545), (3, 'Sara', 'Female', 25, 600), (4, 'Laura', 'Female', 18, 400), (5, 'Alan', 'Male', 20, 500)
उपरोक्त SQL स्क्रिप्ट एक डेटाबेस स्कूलडीबी बनाती है। इस डेटाबेस में, एक टेबल स्टूडेंट बनाया जाता है और उस टेबल में कुछ डमी डेटा जोड़ा जाता है।
बिना लेन-देन के क्वेरी निष्पादित करना
आइए तीन मानक क्वेरी निष्पादित करें। हम इस समय लेनदेन का उपयोग नहीं कर रहे हैं।
INSERT INTO student VALUES (6, 'Suzi', 'Female', 25, 395) UPDATE student SET age = 'Six' WHERE id= 6 DELETE from student WHERE id = 6
यहां पहली क्वेरी डेटाबेस में छात्र रिकॉर्ड सम्मिलित करती है। दूसरी क्वेरी छात्र की उम्र को अपडेट करती है और तीसरी क्वेरी नए डाले गए रिकॉर्ड को हटा देती है।
यदि आप उपरोक्त स्क्रिप्ट को निष्पादित करते हैं, तो आप देखेंगे कि रिकॉर्ड डेटाबेस में डाला जाएगा और फिर दूसरी क्वेरी निष्पादित करते समय एक त्रुटि उत्पन्न होगी।
यदि आप दूसरी क्वेरी को देखें, तो हम आयु कॉलम में एक स्ट्रिंग मान संग्रहीत करके आयु अपडेट कर रहे हैं जो पूर्णांक प्रकार डेटा संग्रहीत कर सकता है। इसलिए एक त्रुटि फेंक दी जाएगी। हालाँकि, पहली क्वेरी अभी भी सफलतापूर्वक पूर्ण होगी। इसका मतलब यह है कि यदि आप छात्र तालिका से सभी रिकॉर्ड का चयन करते हैं, तो आपको नया डाला गया रिकॉर्ड दिखाई देगा।
[टेबल आईडी=23 /]
आप देख सकते हैं कि id=6 और 'Suzi' नाम वाला रिकॉर्ड डेटाबेस में डाला गया है। लेकिन उम्र को अपडेट नहीं किया जा सका और दूसरी क्वेरी विफल रही।
अगर हम यह नहीं चाहते तो क्या करें? क्या होगा यदि हम यह सुनिश्चित करना चाहते हैं कि या तो सभी प्रश्न सफलतापूर्वक निष्पादित हों या कोई भी प्रश्न निष्पादित न हो? यहीं पर लेन-देन काम आता है।
लेन-देन के साथ क्वेरी निष्पादित करना
अब हम लेन-देन के भीतर उपरोक्त तीन प्रश्नों को निष्पादित करते हैं।
सबसे पहले, आइए देखें कि लेन-देन कैसे करें और कैसे करें।
लेन-देन बनाना
किसी क्वेरी/क्वेरी को लेन-देन के रूप में चलाने के लिए बस प्रश्नों को BEGIN TRANSACTION और COMMIT TRANSACTION कीवर्ड्स में लपेटें। BEGIN TRANSACTION एक TRANSACTION की शुरुआत की घोषणा करता है जबकि COMMIT TRANSACTION बताता है कि लेनदेन पूरा हो गया है।
आइए हम पहले लेनदेन के रूप में बनाए गए डेटाबेस पर तीन नए प्रश्नों को निष्पादित करते हैं। हम 7 आईडी वाले नए छात्र के लिए एक नया रिकॉर्ड जोड़ेंगे।
BEGIN TRANSACTION INSERT INTO student VALUES (7, 'Jena', 'Female', 22, 456) UPDATE student SET age = 'Twenty Three' WHERE id= 7 DELETE from student WHERE id = 7 COMMIT TRANSACTION
उपरोक्त लेनदेन निष्पादित होने पर, दूसरी क्वेरी में फिर से एक त्रुटि उत्पन्न होगी क्योंकि फिर से एक स्ट्रिंग प्रकार मान को आयु कॉलम में संग्रहीत किया जा रहा है जो केवल पूर्णांक प्रकार डेटा संग्रहीत करता है।
हालांकि, चूंकि त्रुटि लेन-देन के अंदर होती है, इस त्रुटि के होने से पहले सफलतापूर्वक निष्पादित सभी क्वेरी स्वचालित रूप से वापस ले ली जाएंगी। इसलिए, पहली क्वेरी जो आईडी =7 और 'जेना' नाम के साथ एक नया छात्र रिकॉर्ड सम्मिलित करती है, उसे भी वापस ले लिया जाएगा।
अब, यदि आप छात्र तालिका से सभी रिकॉर्ड का चयन करते हैं, तो आप देखेंगे कि 'जेना' के लिए नया रिकॉर्ड सम्मिलित नहीं किया गया है।
मैन्युअल ट्रांजैक्शन रोलबैक
हम जानते हैं कि यदि कोई क्वेरी किसी लेन-देन में कोई त्रुटि उत्पन्न करती है, तो पहले से निष्पादित सभी क्वेरी सहित संपूर्ण लेन-देन स्वचालित रूप से वापस ले लिया जाता है। हालाँकि, हम जब चाहें किसी लेन-देन को मैन्युअल रूप से रोलबैक भी कर सकते हैं।
किसी लेन-देन को रोलबैक करने के लिए कीवर्ड रोलबैक का उपयोग किया जाता है जिसके बाद लेनदेन का नाम आता है। लेन-देन को नाम देने के लिए, निम्नलिखित सिंटैक्स का उपयोग किया जाता है:
BEGIN TRANSACTION Transaction_name
मान लीजिए कि हम चाहते हैं कि हमारी छात्र तालिका में डुप्लिकेट छात्र नामों वाला कोई रिकॉर्ड न हो। हम एक नए छात्र के लिए एक रिकॉर्ड जोड़ेंगे। इसके बाद हम जांच करेंगे कि क्या नए डाले गए छात्र के नाम के समान नाम वाला छात्र डेटाबेस में मौजूद है। यदि उस नाम वाला छात्र पहले से मौजूद नहीं है तो हम अपना लेनदेन करेंगे। यदि उस नाम का कोई छात्र मौजूद है, तो हम अपने लेन-देन को वापस ले लेंगे। हम अपनी क्वेरी में सशर्त बयानों का उपयोग करेंगे।
निम्न लेन-देन पर एक नज़र डालें:
DECLARE @NameCount int BEGIN TRANSACTION AddStudent INSERT INTO student VALUES (8, 'Jacob', 'Male', 21, 600) SELECT @NameCount = COUNT(*) FROM student WHERE name = 'Jacob' IF @NameCount > 1 BEGIN ROLLBACK TRANSACTION AddStudent PRINT 'A student with this name already exists' END ELSE BEGIN COMMIT TRANSACTION AddStudent PRINT 'New record added successfully' END
उपरोक्त स्क्रिप्ट को ध्यान से देखें। यहां बहुत सारी चीजें हो रही हैं।
पहली पंक्ति में, हम एक पूर्णांक प्रकार SQL चर NameCount बनाते हैं।
इसके बाद, हम 'AddStudent' नाम से एक ट्रांजैक्शन शुरू करते हैं। आप अपने लेन-देन को कोई भी नाम दे सकते हैं।
लेन-देन के अंदर, हमने एक छात्र के लिए आईडी =8 और 'जैकब' नाम के साथ एक नया रिकॉर्ड डाला।
अगला, COUNT एग्रीगेट फ़ंक्शन का उपयोग करके हम छात्र रिकॉर्ड की संख्या की गणना करते हैं जहां नाम 'जैकब' है और परिणाम को 'NameCount' चर में संग्रहीत करते हैं।
अगर वेरिएबल का मान 1 से अधिक है, तो इसका मतलब है कि 'जैकब' नाम वाला छात्र पहले से ही डेटाबेस में मौजूद है। उस स्थिति में, हम अपने लेन-देन को रोलबैक करते हैं और स्क्रीन पर एक संदेश प्रिंट करते हैं कि 'इस नाम वाला एक छात्र पहले से मौजूद है'।
यदि नहीं, तो हम अपना लेन-देन करते हैं और 'नया रिकॉर्ड सफलतापूर्वक जोड़ा गया' संदेश प्रदर्शित करते हैं।
जब आप पहली बार उपरोक्त लेन-देन करते हैं, तो 'जैकब' नाम के साथ कोई छात्र रिकॉर्ड नहीं होगा। इसलिए लेन-देन किया जाएगा और निम्न संदेश मुद्रित किया जाएगा:
अब निम्न SQL स्क्रिप्ट को सर्वर पर चलाने का प्रयास करें:
DECLARE @NameCount int BEGIN TRANSACTION AddStudent INSERT INTO student VALUES (9, 'Jacob', 'Male', 22, 400) SELECT @NameCount = COUNT(*) FROM student WHERE name = 'Jacob' IF @NameCount > 1 BEGIN ROLLBACK TRANSACTION AddStudent PRINT 'A student with this name already exists' END ELSE BEGIN COMMIT TRANSACTION PRINT 'New record added successfully' END
यहां फिर से, हम आईडी =9 और 'जैकब' नाम के साथ छात्र रिकॉर्ड डाल रहे हैं। चूंकि 'जैकब' नाम का एक छात्र रिकॉर्ड पहले से ही डेटाबेस में मौजूद है, लेन-देन वापस आ जाएगा और निम्न संदेश मुद्रित किया जाएगा:
उपयोगी लिंक
- एसक्यूएल लेनदेन पर कक्षाएं