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

लेन-देन: सभी या कुछ भी नहीं

लेन-देन संचालन का एक समूह है जिसे डेटाबेस मानता है एकल इकाई: या तो वे सभी सफल होते हैं, या उनमें से कोई भी नहीं छोड़ता ट्रेस. यह इस प्रकार है कि आप अनुक्रम के दौरान स्वयं को विसंगतियों से बचाते हैं UPDATE/INSERT/DELETE को सुसंगत रहना चाहिए।

वाक्यविन्यास

SQL
BEGIN;             -- apri la transazione

UPDATE …;
INSERT …;
DELETE …;
SELECT …;          -- puoi anche solo leggere

COMMIT;            -- conferma tutte le modifiche
-- oppure
ROLLBACK;          -- annulla tutte le modifiche, come se nulla fosse

BEGIN और COMMIT के बीच सब कुछ परमाणु है: कोई अन्य संबंध नहीं मध्यवर्ती अवस्था को देखता है। यदि प्रोग्राम क्रैश हो जाता है या निष्पादित हो जाता है ROLLBACK, डेटाबेस बिल्कुल वैसा ही रहता है जैसा कि BEGIN से पहले था।

क्लासिक परिदृश्य: स्थानांतरण

विहित उदाहरण उत्पादों (या धन) के बीच स्टॉक स्थानांतरण है खातों के बीच स्थानांतरण): दो UPDATEs जिन्हें एक साथ सफल होना चाहिए, कभी भी एक हां और दूसरा ना.

SQL
BEGIN;
UPDATE products SET stock = stock - 1 WHERE id = 1;
UPDATE products SET stock = stock + 1 WHERE id = 2;
COMMIT;

यदि दूसरा UPDATE विफल रहता है (उदाहरण के लिए CHECK बाधा त्रुटि), तो a ROLLBACK उत्पाद 1 के स्टॉक को उसके मूल मूल्य पर पुनर्स्थापित करता है।

रोलबैक: डीबीए का डिबगर

SQL
BEGIN;
UPDATE customers SET city = 'X' WHERE id = 1;
SELECT first_name, city FROM customers WHERE id = 1;   -- "vedo come è cambiato"
ROLLBACK;

वास्तविक डेटा पर UPDATE को आजमाने के लिए एक बहुत ही उपयोगी पैटर्न: आप इसे चलाएं, उसी लेनदेन में SELECT के साथ परिणाम का निरीक्षण करें, और यदि यह आपको आश्वस्त नहीं करता है, तो आप ROLLBACK — डेटाबेस बिल्कुल वैसा ही है यह पहले था.

सेवप्वाइंट: आंशिक रोलबैक

लेन-देन के अंदर आप मध्यवर्ती बिंदु बना सकते हैं:

SQL
BEGIN;
UPDATE customers SET city = 'A' WHERE id = 1;
SAVEPOINT step1;
UPDATE customers SET city = 'B' WHERE id = 2;
-- mi sono accorto che il secondo UPDATE è sbagliato:
ROLLBACK TO SAVEPOINT step1;
COMMIT;     -- solo il primo UPDATE viene confermato

30 सेकंड में एसिड

लेन-देन एसिड गुणों की गारंटी देते हैं:

  • एटोमिसिटी - सब कुछ या कुछ भी नहीं;
  • सीअस्थिरता - लेन-देन की शुरुआत और अंत में बाधाएं संतुष्ट रहती हैं;
  • मैंसमाधान - समवर्ती लेनदेन में मध्यवर्ती स्थिति नहीं दिखती (विभिन्न "स्तरों" पर);
  • डीयूरेबिलिटी - एक सफल COMMIT दुर्घटना की स्थिति में भी नष्ट नहीं होता है।

आपकी बारी

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

एक ही लेन-देन में: उत्पाद 1 के स्टॉक में 1 की कमी और उत्पाद 2 के स्टॉक में 1 की वृद्धि। BEGIN के साथ खोलें और COMMIT के साथ बंद करें।

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

संबंधित SET क्लॉज में संदर्भ स्टॉक - 1 और स्टॉक + 1।

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

व्यायाम की समीक्षा करें

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

एक लेन-देन खोलें, ग्राहक के शहर को आईडी=1 से 'स्पेरिमेंटेल' में अपडेट करने का प्रयास करें, फिर रोलबैक के साथ ऑपरेशन रद्द करें। अंत में ग्राहक 1 का शहर मूल शहर ('मिलानो') होना चाहिए।

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

रोलबैक BEGIN के बाद से किए गए प्रत्येक परिवर्तन को रद्द कर देता है।

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