Kodokon kodokon.com

ट्रांज़ैक्शन: BEGIN, COMMIT, ROLLBACK और ACID

ट्रांज़ैक्शन से अपने राइट्स को परमाणविक बनाएँ और समझें कि रोज़मर्रा के व्यवहार में ACID की गारंटियाँ क्या मायने रखती हैं।

8 मिनट · 3 प्रश्न

इस पाठ को Kodokon में खोलें

एक बैंक ट्रांसफ़र दो UPDATE होते हैं: एक खाते से पैसे निकालना, दूसरे में जमा करना। यदि दूसरा विफल हो जाए, तो डेटाबेस झूठ बोलता है। ट्रांज़ैक्शन इस ब्लॉक को अविभाज्य बना देता है, ACID गारंटियों के साथ: Atomicity यानी परमाणविकता (सब कुछ या कुछ नहीं), Consistency यानी संगति (बाधाएँ वैध बनी रहती हैं), Isolation यानी पृथक्करण (समवर्ती ट्रांज़ैक्शन कभी एक-दूसरे को आधा-अधूरा नहीं देखते), Durability यानी टिकाऊपन (एक COMMIT क्रैश के बाद भी बचा रहता है)। इस पाठ के लिए असली sqlite3 क्लाइंट को प्राथमिकता दें: कुछ वेब सैंडबॉक्स हर क्वेरी को स्वतः कमिट कर देते हैं।

SQL
CREATE TABLE accounts (
  id INTEGER PRIMARY KEY,
  owner TEXT NOT NULL,
  balance REAL NOT NULL CHECK (balance >= 0)
);

INSERT INTO accounts (owner, balance)
VALUES
  ('alice', 500.0),
  ('bruno', 120.0);
CHECK बाधा किसी भी ऋणात्मक बैलेंस को रोकती है।

सामान्य मामला: BEGIN ट्रांज़ैक्शन खोलता है, राइट्स इकट्ठा होते जाते हैं, COMMIT उन सबको एक साथ अंतिम रूप दे देता है। इस बीच, कोई अन्य कनेक्शन मध्यवर्ती स्थिति नहीं देखता (alice से पैसे निकल गए, bruno में अभी जमा नहीं हुए)।

SQL
BEGIN;

UPDATE accounts
SET balance = balance - 200
WHERE owner = 'alice';

UPDATE accounts
SET balance = balance + 200
WHERE owner = 'bruno';

COMMIT;

SELECT owner, balance FROM accounts;
परमाणविक ट्रांसफ़र: alice के लिए 300, bruno के लिए 320।

अब विफलता का मामला। bruno से 400 निकालना CHECK (balance >= 0) का उल्लंघन करता: कथन विफल हो जाता है। एक SQLite सूक्ष्मता: डिफ़ॉल्ट रूप से, कोई त्रुटि दोषी कथन को रद्द करती है लेकिन ट्रांज़ैक्शन को खुला छोड़ देती है। तय करना आपके एप्लिकेशन कोड पर है: सब कुछ पूर्ववत करने के लिए ROLLBACK (समझदारी भरी सहज प्रतिक्रिया), या यदि त्रुटि से उबरना संभव हो तो जारी रखना।

SQL
BEGIN;

UPDATE accounts
SET balance = balance - 400
WHERE owner = 'bruno';
-- Error: CHECK (balance >= 0) rejects the row.

ROLLBACK;

SELECT owner, balance FROM accounts;
ROLLBACK के बाद, पिछले COMMIT के बैलेंस अक्षुण्ण रहते हैं।

ज्ञान जांच

सुनिश्चित करें कि आपको इस पाठ के मुख्य बिंदु याद हैं।

  1. परमाणविकता, यानी ACID का A, क्या गारंटी देती है?
    • ट्रांज़ैक्शन की क्वेरियाँ तेज़ चलती हैं
    • ट्रांज़ैक्शन या तो पूरा लागू होता है या बिल्कुल नहीं
    • दो ट्रांज़ैक्शन कभी एक ही टेबल नहीं पढ़ सकते
  2. किसी ROLLBACK के बाद, डेटाबेस किस स्थिति में होता है?
    • पिछले COMMIT वाली, मानो BEGIN कभी हुआ ही न हो
    • त्रुटि से पहले सफल हुए UPDATE बने रहते हैं
    • डेटाबेस अगले BEGIN तक लॉक रहता है
  3. एक ही SQLite ट्रांज़ैक्शन में 10,000 INSERT बहुत तेज़ क्यों होते हैं?
    • SQLite डाले गए डेटा को थोक में संपीड़ित करता है
    • प्रति कथन एक के बजाय COMMIT पर एक ही डिस्क सिंक
    • ट्रांज़ैक्शन के दौरान इंडेक्स निष्क्रिय कर दिए जाते हैं