2009-06-25 12 views
36

SQL सर्वर 2005 में लेनदेन अलगाव स्तर के लिए स्कोपिंग नियम क्या हैं? मुझे पता है कि विभिन्न स्तरों का क्या मतलब है, लेकिन मैन्युअल रूप से चलाने वाली स्क्रिप्ट के बाहर उन्हें सही ढंग से लागू करने का तरीका नहीं है। मुझे उत्पादन-गुणवत्ता कोड में व्यावहारिक उपयोग के लिए एक गाइड नहीं मिल रहा है।लेनदेन अलगाव स्तर स्कोप्स

जाहिर है, गुंजाइश शुरू होती है जब आप इस प्रकार का आदेश का उपयोग करें:

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED 

लेकिन जहां यह खत्म हो जाता है? यदि मैं एक संग्रहित प्रक्रिया में आईएसओ स्तर सेट करता हूं और फिर वह प्रो किसी अन्य को कॉल करता है, तो क्या नेस्टेड प्रो इसे प्राप्त करता है? इससे भी बेहतर, अगर मैं नेस्टेड प्रो के अंदर आईएसओ स्तर बढ़ाता हूं तो क्या यह कॉलिंग प्रो में वापस ले जा रहा है? लेनदेन आदेश जैसे BEGIN TRAN, रोलबैक, और COMMIT कोई अंतर करते हैं?

जब किसी संग्रहित प्रो को किसी एप्लिकेशन या एजेंट नौकरी द्वारा बुलाया जाता है तो क्या अलगाव स्तर में परिवर्तन कुछ तरीकों से जारी रहता है? क्या मुझे हमेशा प्रत्येक proc के अंत में प्रेषित डिफ़ॉल्ट रीड पर वापस जाना होगा?

मैं इसे विभिन्न परिस्थितियों में परीक्षण करता हूं लेकिन मुझे नहीं पता कि वर्तमान अलगाव स्तर क्या निर्धारित किया जाता है।

+0

तथ्य यह है कि इसका दायरा मौजूदा लेनदेन से परे चला जाता है (और, वर्तमान "सत्र" से परे कनेक्शन पूलिंग के कारण) आपको जला सकता है। [इस पोस्ट] देखें (http://www.codeducky.org/mysterious-deadlocks-leaking-isolation-levels/) मैंने इस विषय पर लिखा था। – ChaseMedallion

उत्तर

36

भागो के बाद और खुद के लिए देखें:

CREATE PROCEDURE dbo.KeepsIsolation 
AS 
BEGIN 
PRINT 'Inside sproc that does not change isolation level'; 
DBCC USEROPTIONS; 
END 
GO 

CREATE PROCEDURE dbo.ChangesIsolation 
AS 
BEGIN 
PRINT 'Inside sproc that changes isolation level'; 
SET TRANSACTION ISOLATION LEVEL READ COMMITTED; 
DBCC USEROPTIONS; 
END 
GO 
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ; 
DBCC USEROPTIONS; 
EXEC dbo.KeepsIsolation; 
DBCC USEROPTIONS; 
EXEC dbo.ChangesIsolation; 
-- demonstrates that isolation level restored to REPEATABLE READ after exiting the procedure 
    DBCC USEROPTIONS; 
+14

तो ऐसा लगता है कि मूल प्रो को बाल प्रो के भीतर आईएसओ स्तर में परिवर्तनों से प्रभावित नहीं होता है, लेकिन बाल प्रो को माता-पिता के आईएसओ स्तर को डिफ़ॉल्ट के रूप में प्राप्त होता है। – SurroundedByFish

2

अलगाव स्तर लेनदेन के साथ वापस रोल नहीं करता है।

अलगाव स्तर वर्तमान में रहता है भले ही आप प्रक्रियाओं और कार्यों में कॉल करते हैं।

4

पुस्तकों से लाइन

केवल लेन-देन अलगाव स्तर विकल्पों में से एक पर एक समय में सेट किया जा सकता, और यह है कि कनेक्शन जब तक यह स्पष्ट रूप से बदल गया है के लिए निर्धारित रहता है। यह डिफ़ॉल्ट व्यवहार बन जाता है जब तक कि ऑप्टिमाइज़ेशन विकल्प पर कथन के FROM खंड में तालिका स्तर पर निर्दिष्ट किया गया है।

+6

हालांकि, स्वीकृत उत्तर दर्शाता है कि यह सच नहीं है - एक संग्रहित proc के भीतर ISOLATION स्तर को बदलना कॉलिंग संग्रहित प्रो के लिए स्तर को नहीं बदलता है। या तो दस्तावेज़ गलत हैं या मैंने गलत समझा है। – redcalx

+1

पिछली टिप्पणी के साथ सहमत हैं। जबकि मैं बीओएल टिप्पणी के उद्धरण की सराहना करता हूं, यह स्वीकार्य उत्तर के साथ बाधाओं में प्रतीत होता है। – snth

+2

असल में यह सही है। यह भी पूरा नहीं है। अब, यदि आप प्रलेखन में दिए गए अपवाद को अनदेखा करते हैं (एंड्री से उद्धरण जांचें) तो - आह - हाँ, यह एक पोस्ट का बुरा जवाब है। – TomTom

13

DBCC USEROPTIONS अन्य सभी एसईटी विकल्पों के साथ वर्तमान अलगाव स्तर प्रदर्शित करेगा।

0

ताले और उदाहरण के साथ विस्तार से डेटाबेस पर इसके प्रभाव सहित एसक्यूएल सर्वर में अलगाव स्तर के बारे में और अधिक जानकारी प्राप्त करने के लिए, नीचे दिए गए लिंक का उल्लेख: http://www.sqllion.com/2009/07/transaction-isolation-levels-in-sql-server/

+0

लिंक अब मर चुका है – Stefan

14

से MSDN

आप एक में सेट लेनदेन अलगाव स्तर जारी करते हैं और संग्रहीत प्रक्रिया या ट्रिगर, जब ऑब्जेक्ट नियंत्रण अलगाव स्तर पर नियंत्रण देता है तो ऑब्जेक्ट को पर लागू होने पर प्रभाव के स्तर पर रीसेट किया जाता है। उदाहरण के लिए, यदि आप बैच में रीपेटेबल रीड सेट करते हैं, और बैच तब संग्रहीत प्रक्रिया को कॉल करता है जो अलगाव स्तर को अलगाव के लिए सेट करता है, अलगाव स्तर सेटिंग रीपेटेबल पढ़ने के लिए वापस लौटाती है जब संग्रहित प्रक्रिया बैच पर नियंत्रण लौटाती है।

0

कृपया ध्यान दें और या लेन-देन के स्तर के दायरे SqlServer 2012 के साथ कोई समस्या है पहले जब उच्च निष्पादन ADO.NET कनेक्शन पूलिंग जहां यह वास्तव में कनेक्शन के समापन भर में बच सकते हैं प्रयोग किया जाता है:

SQL Server: Isolation level leaks across pooled connections

https://social.msdn.microsoft.com/Forums/sqlserver/en-US/916b3d8a-c464-4ad5-8901-6f845a2a3447/sql-server-2014-reseting-isolation-level?forum=sqldatabaseengine

संबंधित मुद्दे