Microsoft SQL Server
लेन-देन अलगाव स्तर
खोज…
वाक्य - विन्यास
- सेट परिवहन अलगाव की स्थिति {पढ़ें बेची गई | READ COMMITTED | दोहराव वाला READ | SNAPSHOT | अनुक्रमिक} [; ]
टिप्पणियों
MSDN संदर्भ: सेट परिवहन अलगाव स्तर
बिना पढ़े लिखे
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
यह सबसे अधिक अनुमेय अलगाव स्तर है, जिसमें यह किसी भी ताले का कारण नहीं बनता है। यह निर्दिष्ट करता है कि बयान सभी पंक्तियों को पढ़ सकते हैं, जिसमें पंक्तियों को भी शामिल किया गया है जो लेनदेन में लिखे गए हैं लेकिन अभी तक प्रतिबद्ध नहीं हैं (यानी, वे अभी भी लेनदेन में हैं)। यह अलगाव स्तर "गंदे रीड्स" के अधीन हो सकता है।
कमिटेड पढ़ें
SET TRANSACTION ISOLATION LEVEL READ COMMITTED
यह अलगाव स्तर 2 सबसे अधिक अनुमेय है। यह गंदे रीड्स को रोकता है। READ_COMMITTED_SNAPSHOT
की सेटिंग पर READ COMMITTED
का व्यवहार निर्भर करता है:
यदि ऑफ़ (डिफ़ॉल्ट सेटिंग) पर सेट किया जाता है, तो लेन-देन अन्य लेन-देन को मौजूदा लेनदेन द्वारा उपयोग की जाने वाली पंक्तियों को संशोधित करने से रोकने के लिए साझा ताले का उपयोग करता है, साथ ही साथ अन्य लेनदेन द्वारा संशोधित पंक्तियों को पढ़ने से वर्तमान लेनदेन को अवरुद्ध करता है।
यदि इसे चालू किया जाता है, तो
READCOMMITTEDLOCK
तालिका संकेत का उपयोगREAD COMMITTED
मोड में चल रहे लेन-देन के लिए पंक्ति संस्करण के बजाय साझा लॉकिंग का अनुरोध करने के लिए किया जा सकता है।
नोट: READ COMMITTED
डिफ़ॉल्ट SQL सर्वर व्यवहार है।
"गंदे रीड्स" क्या हैं?
डर्टी रीड्स (या अनक्मिटेड रीड्स) उन पंक्तियों के रीड होते हैं जिन्हें ओपन ट्रांजेक्शन द्वारा संशोधित किया जा रहा है।
इस व्यवहार को 2 अलग-अलग प्रश्नों का उपयोग करके दोहराया जा सकता है: एक लेन-देन खोलने के लिए और कुछ डेटा को बिना किसी टेबल पर लिखने के लिए, दूसरा इस अलगाव स्तर के साथ लिखे जाने वाले डेटा (लेकिन अभी तक प्रतिबद्ध नहीं) का चयन करने के लिए।
प्रश्न 1 - एक लेनदेन तैयार करें लेकिन इसे समाप्त न करें:
CREATE TABLE dbo.demo (
col1 INT,
col2 VARCHAR(255)
);
GO
--This row will get committed normally:
BEGIN TRANSACTION;
INSERT INTO dbo.demo(col1, col2)
VALUES (99, 'Normal transaction');
COMMIT TRANSACTION;
--This row will be "stuck" in an open transaction, causing a dirty read
BEGIN TRANSACTION;
INSERT INTO dbo.demo(col1, col2)
VALUES (42, 'Dirty read');
--Do not COMMIT TRANSACTION or ROLLBACK TRANSACTION here
प्रश्न 2 - खुले लेनदेन सहित पंक्तियों को पढ़ें:
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
SELECT * FROM dbo.demo;
यह दिखाता है:
col1 col2 ----------- --------------------------------------- 99 Normal transaction 42 Dirty read
पुनश्च: इस डेमो डेटा को साफ करने के लिए मत भूलना:
COMMIT TRANSACTION;
DROP TABLE dbo.demo;
GO
बार-बार पढ़ने योग्य
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ
यह ट्रांजैक्शन आइसोलेशन लेवल READ COMMITTED
से थोड़ा कम अनुमेय है, जिसमें शेयर किए गए लॉक को ट्रांजेक्शन में प्रत्येक स्टेटमेंट द्वारा पढ़े गए सभी डेटा पर रखा जाता है और ट्रांजैक्शन पूरा होने तक होल्ड किया जाता है, जैसा कि प्रत्येक स्टेटमेंट के बाद रिलीज होने का विरोध किया जाता है।
नोट: इस विकल्प का उपयोग केवल तब करें जब आवश्यक हो, क्योंकि डेटाबेस प्रदर्शन में गिरावट के साथ-साथ READ COMMITTED
तुलना में गतिरोध की संभावना अधिक होती है।
स्नैपशॉट
SET TRANSACTION ISOLATION LEVEL SNAPSHOT
निर्दिष्ट करता है कि किसी लेनदेन में किसी स्टेटमेंट द्वारा पढ़ा जाने वाला डेटा ट्रांजेक्शनल रूप से सुसंगत संस्करण होगा, जो ट्रांजैक्शन की शुरुआत में मौजूद था, यानी यह केवल उस डेटा को पढ़ेगा, जो ट्रांजैक्शन शुरू होने से पहले कमिट किया गया है।
SNAPSHOT
लेनदेन पढ़े जा रहे डेटा पर किसी भी ताले का अनुरोध या कारण नहीं देते हैं, क्योंकि यह केवल उस डेटा के संस्करण (या स्नैपशॉट) को पढ़ रहा है, जो उस समय लेनदेन शुरू हुआ था।
SNAPSHOT
आइसोलेशन स्तर में चल रहा एक लेन-देन केवल अपने डेटा परिवर्तन को पढ़ता है जबकि यह चल रहा है। उदाहरण के लिए, एक लेन-देन कुछ पंक्तियों को अद्यतन कर सकता है और फिर अद्यतन पंक्तियों को पढ़ सकता है, लेकिन यह परिवर्तन केवल वर्तमान लेनदेन के लिए दिखाई देगा जब तक कि यह प्रतिबद्ध नहीं है।
नोट: ALLOW_SNAPSHOT_ISOLATION
डेटाबेस विकल्प को SNAPSHOT
अलगाव स्तर का उपयोग करने से पहले चालू किया जाना चाहिए।
serializable
SET TRANSACTION ISOLATION LEVEL SERIALIZEABLE
यह अलगाव स्तर सबसे अधिक प्रतिबंधक है। यह अनुरोध करता है कि लेन-देन में प्रत्येक कथन द्वारा पढ़े जाने वाले प्रमुख मानों की श्रेणी लॉक हो जाती है। इसका अर्थ यह भी है कि यदि अन्य पंक्तियों को वर्तमान लेन-देन द्वारा लॉक की गई सीमा में हैं, तो अन्य लेन-देन से INSERT
विवरण अवरुद्ध हो जाएंगे।
यह विकल्प सेट करने जैसा ही होता है HOLDLOCK
सभी में सभी टेबल पर SELECT
के लेनदेन में बयान।
नोट: इस ट्रांजैक्शन आइसोलेशन में सबसे कम कंसिस्टेंसी है और इसका इस्तेमाल केवल आवश्यक होने पर ही किया जाना चाहिए।