मुख्य सामग्री पर जाएं
मॉड्यूल 11 · पाठ 1 का 4पाठ्यक्रम में 41/57~15 min
मॉड्यूल पाठ (1/4)

एसिड लेनदेन (शुरू/प्रतिबद्ध)

किसी भी डेटाबेस के लिए विश्वसनीयता की नींव ACID संक्षिप्त नाम पर टिकी है:

  • एटोमिसिटी: एक ऑपरेशन या तो पूरी तरह से पूरा हो जाता है (कमिट), या पीछे कोई आधा-अधूरा निशान छोड़कर विफल हो जाता है (रोलबैक)।
  • सीस्थिरता: डेटाबेस नियमों (जैसे बाधाएं, विदेशी कुंजी) का हमेशा सम्मान किया जाता है।
  • मैंसमाधान: एक ही समय में होने वाले लेन-देन एक-दूसरे के साथ अनियंत्रित तरीके से हस्तक्षेप नहीं करते हैं।
  • डीयूरेबिलिटी: कमिट के बाद, परिवर्तन अपरिवर्तनीय रूप से डिस्क पर लिखा जाता है।

लेन-देन वाक्यविन्यास

आम तौर पर प्रत्येक अद्यतन या DELETE क्वेरी को एक स्टैंडअलोन लेनदेन (ऑटोकॉमिट) के रूप में माना जाता है। लेकिन जब आप कई परिचालनों को एक साथ समूहित करना चाहते हैं, उदाहरण के लिए ग्राहक के खाते से डेबिट करना और ऑर्डर देना, तो आपको इसे लेनदेन सिंटैक्स का उपयोग करके स्पष्ट रूप से करना होगा।

SQL
BEGIN;

UPDATE accounts SET balance = balance - 100 WHERE user_id = 1;
INSERT INTO orders (user_id, total) VALUES (1, 100);

COMMIT; -- Writes the changes

यदि इन जटिल निष्पादनों के दौरान क्वेरी भेजने वाले जावास्क्रिप्ट ऐप को पता चलता है कि कोई समस्या है (उदाहरण के लिए गोदाम में पर्याप्त स्टॉक नहीं है और यह क्रैश हो जाता है), तो यह निम्न भेजेगा:

SQL
ROLLBACK; -- Cancels the changes and discards the 2 queries sent in the block

खुद कोशिश करना

व्यायाम#sql.m11.l1.e1
प्रयास: 0लोड हो रहा है...

एक लेन-देन खोलें।\nअस्थायी तालिका में उत्पाद की 'मात्रा' को 0 पर सेट करते हुए आईडी 10 के साथ उत्पाद को अपडेट करें (रुको नहीं, 'मात्रा' उत्पादों पर नहीं है, आइए आविष्कार करें: 'यूनिट_प्राइस' को 'ऑर्डर_आइटम' में बदलें लेकिन इसके लिए एक बाधा की आवश्यकता है।\nआइए बेहतर करें: ऑर्डर आईडी 5 की स्थिति को 'शिप्ड' पर अपडेट करें और लेनदेन को सफलतापूर्वक पूरा करें।

संपादक लोड हो रहा है...
संकेत दिखाएँ

BEGIN से शुरू करें;, id = 5 के लिए ऑर्डर को status='shiped' में बदलें, फिर इसे COMMIT के साथ भेजें;

3 प्रयासों के बाद समाधान उपलब्ध है

व्यायाम#sql.m11.l1.e2
प्रयास: 0लोड हो रहा है...

उत्पादन में दहशत! एक डेवलपर ने ऐतिहासिक रूप से सभी समीक्षाओं को मिटाते हुए WHERE के बिना एक DELETE लिखा।\nआइए उन्हें दिखाएं कि रोलबैक कैसे किया जाता है। लेन-देन शुरू करें, एक त्वरित DELETE को सक्रिय करें जो 'समीक्षाओं' (बिना WHERE क्लॉज के) से सब कुछ मिटा देता है, लेकिन फिर ब्लॉक को पूरा करने से पहले प्रभाव को पूर्ववत करने के लिए SQL लाइफसेवर का उपयोग करें।

संपादक लोड हो रहा है...
संकेत दिखाएँ

प्रारंभ;, 'समीक्षाओं' पर क्लीन-स्लेट डिलीट, और फिर जादुई रोलबैक; अंत में।

3 प्रयासों के बाद समाधान उपलब्ध है