ट्रांज़ैक्शन से अपने राइट्स को परमाणविक बनाएँ और समझें कि रोज़मर्रा के व्यवहार में ACID की गारंटियाँ क्या मायने रखती हैं।
इस पाठ को Kodokon में खोलेंएक बैंक ट्रांसफ़र दो UPDATE होते हैं: एक खाते से पैसे निकालना, दूसरे में जमा करना। यदि दूसरा विफल हो जाए, तो डेटाबेस झूठ बोलता है। ट्रांज़ैक्शन इस ब्लॉक को अविभाज्य बना देता है, ACID गारंटियों के साथ: Atomicity यानी परमाणविकता (सब कुछ या कुछ नहीं), Consistency यानी संगति (बाधाएँ वैध बनी रहती हैं), Isolation यानी पृथक्करण (समवर्ती ट्रांज़ैक्शन कभी एक-दूसरे को आधा-अधूरा नहीं देखते), Durability यानी टिकाऊपन (एक COMMIT क्रैश के बाद भी बचा रहता है)। इस पाठ के लिए असली sqlite3 क्लाइंट को प्राथमिकता दें: कुछ वेब सैंडबॉक्स हर क्वेरी को स्वतः कमिट कर देते हैं।
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);सामान्य मामला: BEGIN ट्रांज़ैक्शन खोलता है, राइट्स इकट्ठा होते जाते हैं, COMMIT उन सबको एक साथ अंतिम रूप दे देता है। इस बीच, कोई अन्य कनेक्शन मध्यवर्ती स्थिति नहीं देखता (alice से पैसे निकल गए, bruno में अभी जमा नहीं हुए)।
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;अब विफलता का मामला। bruno से 400 निकालना CHECK (balance >= 0) का उल्लंघन करता: कथन विफल हो जाता है। एक SQLite सूक्ष्मता: डिफ़ॉल्ट रूप से, कोई त्रुटि दोषी कथन को रद्द करती है लेकिन ट्रांज़ैक्शन को खुला छोड़ देती है। तय करना आपके एप्लिकेशन कोड पर है: सब कुछ पूर्ववत करने के लिए ROLLBACK (समझदारी भरी सहज प्रतिक्रिया), या यदि त्रुटि से उबरना संभव हो तो जारी रखना।
BEGIN;
UPDATE accounts
SET balance = balance - 400
WHERE owner = 'bruno';
-- Error: CHECK (balance >= 0) rejects the row.
ROLLBACK;
SELECT owner, balance FROM accounts;