सारांश :इस ट्यूटोरियल में, हम आपको दिखाएंगे कि डेटा की अखंडता और विश्वसनीयता सुनिश्चित करने के लिए SQLite लेनदेन का उपयोग कैसे करें।
SQLite और ACID
SQLite एक लेन-देन संबंधी डेटाबेस है जिसमें सभी परिवर्तन और क्वेरी परमाणु, सुसंगत, पृथक और टिकाऊ (ACID) हैं।
SQLite गारंटी देता है कि सभी लेन-देन ACID के अनुरूप हैं, भले ही लेन-देन प्रोग्राम क्रैश, ऑपरेशन सिस्टम डंप, या कंप्यूटर की बिजली की विफलता से बाधित हो।
- ए टॉमिक:एक लेनदेन परमाणु होना चाहिए। इसका अर्थ है कि परिवर्तन को छोटे भागों में नहीं तोड़ा जा सकता। जब आप कोई लेन-देन करते हैं, तो या तो पूरा लेन-देन लागू होता है या नहीं।
- सी ऑनसिस्टेंट:एक लेन-देन को डेटाबेस को एक वैध स्थिति से दूसरे में बदलना सुनिश्चित करना चाहिए। जब कोई लेन-देन शुरू होता है और डेटा को संशोधित करने के लिए एक स्टेटमेंट निष्पादित करता है, तो डेटाबेस असंगत हो जाता है। हालांकि, जब लेन-देन किया जाता है या वापस रोल किया जाता है, तो यह महत्वपूर्ण है कि लेनदेन को डेटाबेस को सुसंगत रखना चाहिए।
- मैं समाधान:एक सत्र द्वारा निष्पादित एक लंबित लेनदेन को अन्य सत्रों से अलग किया जाना चाहिए। जब कोई सत्र लेन-देन शुरू करता है और
INSERT
. को निष्पादित करता है याUPDATE
डेटा को बदलने के लिए बयान, ये परिवर्तन केवल वर्तमान सत्र के लिए दृश्यमान हैं, अन्य नहीं। दूसरी ओर, लेन-देन शुरू होने के बाद अन्य सत्रों द्वारा किए गए परिवर्तन वर्तमान सत्र के लिए दृश्यमान नहीं होने चाहिए। - टिकाऊ:यदि कोई लेन-देन सफलतापूर्वक किया जाता है, तो बिजली की विफलता या प्रोग्राम क्रैश जैसी स्थिति की परवाह किए बिना परिवर्तन डेटाबेस में स्थायी होना चाहिए। इसके विपरीत, यदि लेन-देन करने से पहले प्रोग्राम क्रैश हो जाता है, तो परिवर्तन जारी नहीं रहना चाहिए।
SQLite लेनदेन विवरण
डिफ़ॉल्ट रूप से, SQLite ऑटो-प्रतिबद्ध मोड में काम करता है। इसका मतलब है कि प्रत्येक कमांड के लिए, SQLite स्वचालित रूप से लेनदेन शुरू करता है, संसाधित करता है और करता है।
स्पष्ट रूप से लेन-देन शुरू करने के लिए, आप निम्न चरणों का उपयोग करते हैं:
सबसे पहले, BEGIN TRANSACTION
. जारी करके एक लेन-देन खोलें आदेश।
BEGIN TRANSACTION;
Code language: SQL (Structured Query Language) (sql)
स्टेटमेंट को निष्पादित करने के बाद BEGIN TRANSACTION
, लेन-देन तब तक खुला रहता है जब तक कि यह स्पष्ट रूप से प्रतिबद्ध या वापस नहीं किया जाता है।
दूसरा, डेटाबेस में डेटा को चुनने या अपडेट करने के लिए SQL स्टेटमेंट जारी करें। ध्यान दें कि परिवर्तन केवल वर्तमान सत्र (या क्लाइंट) के लिए दृश्यमान है।
तीसरा, COMMIT
. का उपयोग करके डेटाबेस में परिवर्तन करें या COMMIT TRANSACTION
बयान।
COMMIT;
Code language: SQL (Structured Query Language) (sql)
यदि आप परिवर्तनों को सहेजना नहीं चाहते हैं, तो आप ROLLBACK
. का उपयोग करके वापस रोल कर सकते हैं या ROLLBACK TRANSACTION
कथन:
ROLLBACK;
Code language: SQL (Structured Query Language) (sql)
SQLite लेन-देन का उदाहरण
हम दो नई तालिकाएँ बनाएंगे:accounts
और account_changes
प्रदर्शन के लिए।
accounts
तालिका खाता संख्या और उनके शेष के बारे में डेटा संग्रहीत करती है। account_changes
तालिका खातों के परिवर्तनों को संग्रहीत करती है।
सबसे पहले, accounts
बनाएं और account_changes
निम्नलिखित CREATE TABLE
का उपयोग करके तालिकाएं बयान:
CREATE TABLE accounts (
account_no INTEGER NOT NULL,
balance DECIMAL NOT NULL DEFAULT 0,
PRIMARY KEY(account_no),
CHECK(balance >= 0)
);
CREATE TABLE account_changes (
change_no INT NOT NULL PRIMARY KEY,
account_no INTEGER NOT NULL,
flag TEXT NOT NULL,
amount DECIMAL NOT NULL,
changed_at TEXT NOT NULL
);
Code language: SQL (Structured Query Language) (sql)
दूसरा, accounts
में कुछ नमूना डेटा डालें टेबल।
INSERT INTO accounts (account_no,balance)
VALUES (100,20100);
INSERT INTO accounts (account_no,balance)
VALUES (200,10100);
Code language: SQL (Structured Query Language) (sql)
तीसरा, accounts
. से क्वेरी डेटा टेबल:
SELECT * FROM accounts;
Code language: SQL (Structured Query Language) (sql)
चौथा, 1000 को खाते 100 से 200 में स्थानांतरित करें, और तालिका में परिवर्तन लॉग करें account_changes
एक ही लेन-देन में।
BEGIN TRANSACTION;
UPDATE accounts
SET balance = balance - 1000
WHERE account_no = 100;
UPDATE accounts
SET balance = balance + 1000
WHERE account_no = 200;
INSERT INTO account_changes(account_no,flag,amount,changed_at)
VALUES(100,'-',1000,datetime('now'));
INSERT INTO account_changes(account_no,flag,amount,changed_at)
VALUES(200,'+',1000,datetime('now'));
COMMIT;
Code language: SQL (Structured Query Language) (sql)
पांचवां, accounts
. से क्वेरी डेटा टेबल:
SELECT * FROM accounts;
Code language: SQL (Structured Query Language) (sql)
जैसा कि आप देख सकते हैं, शेष राशि सफलतापूर्वक अपडेट कर दी गई है।
छठा, account_changes
. की सामग्री को क्वेरी करें टेबल:
SELECT * FROM account_changes;
Code language: SQL (Structured Query Language) (sql)
लेन-देन वापस लेने का एक और उदाहरण लेते हैं।
सबसे पहले, खाता 100 से 20,000 काटने का प्रयास करें:
BEGIN TRANSACTION;
UPDATE accounts
SET balance = balance - 20000
WHERE account_no = 100;
INSERT INTO account_changes(account_no,flag,amount,changed_at)
VALUES(100,'-',20000,datetime('now'));
Code language: SQL (Structured Query Language) (sql)
पर्याप्त बैलेंस नहीं होने के कारण SQLite ने त्रुटि जारी की:
[SQLITE_CONSTRAINT] Abort due to constraint violation (CHECK constraint failed: accounts)
Code language: CSS (css)
हालांकि, लॉग को account_changes
. में सहेजा गया है टेबल:
SELECT * FROM account_changes;
Code language: SQL (Structured Query Language) (sql)
दूसरा, ROLLBACK
. का उपयोग करके लेन-देन को वापस रोल करें कथन:
ROLLBACK;
Code language: SQL (Structured Query Language) (sql)
अंत में, account_changes
. से क्वेरी डेटा तालिका, आप देखेंगे कि परिवर्तन संख्या #3 अब नहीं है:
SELECT * FROM account_changes;
Code language: SQL (Structured Query Language) (sql)
इस ट्यूटोरियल में, आपने BEGIN TRANSACTION
का उपयोग करके SQLite लेनदेन से निपटने का तरीका सीखा है। , COMMIT
, और ROLLBACK
SQLite डेटाबेस में लेनदेन को नियंत्रित करने के लिए कथन।