Kodokon kodokon.com

समवर्तिता: लॉक, आइसोलेशन स्तर, फैंटम रीड

SQLite के लॉकिंग मॉडल, उसके ट्रांज़ैक्शन, और SQL मानक द्वारा वर्णित आइसोलेशन विसंगतियों को समझें।

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

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

SQLite पूरी डेटाबेस फ़ाइल के स्तर पर लॉक करता है, रो के स्तर पर नहीं। डिफ़ॉल्ट मोड (रोलबैक जर्नल) में, रीडर एक SHARED लॉक साझा करते हैं, लेकिन एक बार में केवल एक राइटर EXCLUSIVE लॉक प्राप्त कर सकता है। परिणाम: राइट क्रमबद्ध होते हैं। आइए ट्रांज़ैक्शन के साथ काम करने के लिए एक टेबल बनाएँ।

SQL
CREATE TABLE accounts (
  id INTEGER PRIMARY KEY,
  balance INTEGER NOT NULL
);

INSERT INTO accounts (id, balance)
VALUES (1, 100), (2, 50);

-- Read: deferred transaction (default)
BEGIN;
SELECT balance FROM accounts WHERE id = 1;
COMMIT;
BEGIN/COMMIT से घिरा एक स्पष्ट ट्रांज़ैक्शन।

लॉक चरणों में विकसित होता है: UNLOCKED, फिर SHARED (पढ़ना), RESERVED (लिखने का इरादा), PENDING, और अंत में EXCLUSIVE (लिखना)। यदि कोई ट्रांज़ैक्शन पहले से राइट लॉक रखता है, तो दूसरे को SQLITE_BUSY त्रुटि मिलती है। तुरंत विफल होने के बजाय, busy_timeout से एक प्रतीक्षा विलंब सेट करें, और रीडरों तथा राइटर को समानांतर में आगे बढ़ने देने के लिए WAL मोड सक्षम करें।

SQL
-- A single writer, concurrent readers
PRAGMA journal_mode = WAL;

-- Wait up to 5 s if the database is busy
PRAGMA busy_timeout = 5000;
WAL समवर्ती पढ़ाई को अनब्लॉक करता है; busy_timeout प्रतीक्षा करता है।

SQL मानक तीन विसंगतियों का वर्णन करता है: डर्टी रीड (बिना कमिट किया गया डेटा पढ़ना), नॉन-रिपीटेबल रीड (किसी रो को दोबारा पढ़ना और एक भिन्न वैल्यू देखना), और फैंटम रीड (किसी रेंज क्वेरी को दोबारा चलाना और नई रो प्रकट होते देखना)। चूँकि SQLite राइटरों को क्रमबद्ध करता है, यह प्रभावी रूप से SERIALIZABLE की तरह व्यवहार करता है: ये विसंगतियाँ प्रकट नहीं होतीं (read_uncommitted के साथ शेयर्ड-कैश मोड को छोड़कर)। अन्यत्र, आप स्तर को स्पष्ट रूप से चुनते हैं।

SQL
-- Atomic transfer: immediate write lock
BEGIN IMMEDIATE;
UPDATE accounts
SET balance = balance - 10
WHERE id = 1;
UPDATE accounts
SET balance = balance + 10
WHERE id = 2;
COMMIT;
BEGIN IMMEDIATE किसी भी राइट से पहले लॉक आरक्षित कर लेता है।

ज्ञान जांच

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

  1. व्यवहार में SQLite कौन सा आइसोलेशन स्तर प्रदान करता है?
    • READ UNCOMMITTED, डिफ़ॉल्ट रूप से डर्टी रीड संभव हैं
    • READ COMMITTED, PostgreSQL की तरह
    • SERIALIZABLE, क्योंकि एक बार में एक ही राइटर काम करता है
    • कोई नहीं, कोई ट्रांज़ैक्शन ही नहीं हैं
  2. BEGIN और BEGIN IMMEDIATE में क्या अंतर है?
    • BEGIN IMMEDIATE राइट लॉक तुरंत ले लेता है; BEGIN पहले राइट एक्सेस की प्रतीक्षा करता है
    • BEGIN IMMEDIATE रोलबैक जर्नल को अक्षम कर देता है
    • BEGIN IMMEDIATE एक नया डेटाबेस बनाता है
    • व्यवहार में कोई अंतर नहीं है
  3. फैंटम रीड क्या है?
    • ऐसी वैल्यू पढ़ना जिसे किसी अन्य ट्रांज़ैक्शन ने अभी तक कमिट नहीं किया है
    • उसी रो को दोबारा पढ़ना और एक भिन्न वैल्यू पाना
    • किसी रेंज क्वेरी को दोबारा चलाना और इस बीच डाली गई नई रो को प्रकट होते देखना
    • अभी-अभी हटाई गई किसी रो को पढ़ना