2013-01-26 12 views
5

मैं ईएफ 4.0 का उपयोग कर रहा हूं, और मैं अलगाव स्तर serializable का उपयोग करना चाहता हूं, क्योंकि एक लेनदेन में मैं पढ़े जाने पर एक रजिस्टर को ब्लॉक करना चाहता हूं।अलगाव स्तर को कैसे बदला जाए?

खैर, एसक्यूएल सर्वर में मैं इस आदेश के साथ अलगाव के स्तर को बदलने की कोशिश:

SET TRANSACTION ISOLATION LEVEL SERIALIZABLE; 

और सी # में मैं रजिस्टर ब्लॉक करने के लिए प्रयास करने के लिए इस कोड का उपयोग:

using (var scope = new TransactionScope(TransactionScopeOption.Required, new TransactionOptions { IsolationLevel = System.Transactions.IsolationLevel.Serializable })) 
{ 
    Entities myContext = new Entities(); 
    string colors = "select * from Colors where IDColor = 2"; 
    Colors myColor = myContext.Colors.SqlQuery(colors).FirstOrDefault<Colors>(); 
    myColor.Color = "Red"; 
    myContext.SaveChanges(); 
    scope.Complete();     
} 

अगर मैं अगर मैं SaveChanges प्राप्त करता हूं, तो मुझे कोड को लाइन से निष्पादित करें, लेकिन अगर मैं SQL सर्वर प्रबंधन स्टूडियो के साथ तालिका रंगों के लिए कोई क्वेरी करता हूं तो उदाहरण के लिए, मैं रिकॉर्ड प्राप्त कर सकता हूं।

फिर, यदि मैं सहेजने के परिवर्तन निष्पादित करता हूं और मुझे scope.Clompete() मिलता है, तो अगर मैं प्रबंधन स्टूडियो के साथ क्वेरी का प्रयास करता हूं, तो मुझे कुछ भी नहीं मिलता है क्योंकि रजिस्टर अवरुद्ध है, इसलिए जब मैं अपना सी # कोड समाप्त करता हूं, तो रजिस्टर जारी होता है और मुझे प्रबंधन स्टूडियो में परिणाम मिलता है।

तो मेरा सवाल है, सी # में धारावाहिक अलगाव स्तर का उपयोग कैसे करें? क्या मुझसे कुछ गलत हो रही है? मैं देख रहा हूँ

DBCC useroptions; 

कि अलगाव स्तर serializable है, लेकिन अगर मैं प्रबंधन स्टूडियो बंद करके फिर से कनेक्ट करने और देखने के अलगाव स्तर डिफ़ॉल्ट readCommitted है:

पी.एस .: मुझे लगता है कि अगर मैं इस आदेश का उपयोग पर ध्यान दें।

तो मेरा प्रश्न है कि मेरे डेटाबेस के लिए डिफ़ॉल्ट अलगाव स्तर कैसे सेट करें।

+0

मुझे समझ में नहीं आता है। आप पहले से ही एक serializable लेनदेन का उपयोग कर रहे हैं। क्या आप समझा सकते हैं कि आप अलग-अलग क्या चाहते हैं? – usr

उत्तर

1
  • डिफ़ॉल्ट ईएफ लेनदेन अलगाव स्तर प्रयुक्त डेटाबेस प्रदाता पर आधारित है।

  • आपके ef कोड में निर्दिष्ट अलगाव स्तर डेटाबेस सर्वर के लिए डिफ़ॉल्ट अलगाव स्तर का परिणाम होना चाहिए।

  • SQL सर्वर डिफ़ॉल्ट अलगाव स्तर में पढ़ा गया है।

  • तो आपको अपने ईएफ कोड पर अलगाव लेवल निर्दिष्ट करने की आवश्यकता नहीं है। अगर आप इसे डीबी पक्ष पर सेट करते हैं तो यह ईएफ के लिए डिफ़ॉल्ट अलगाव लेवल के रूप में भी लेता है।

पर डीबी चेक Isolation Levels in the Database Engine और SET TRANSACTION ISOLATION LEVEL (Transact-SQL)

अद्यतन

बदलाव के लिए IsolationLevel कैसे बदलें isolation level रन नीचे पर SSMS आदेश में उल्लेख किया है:

USE YourDatabaseName; 
GO 
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE; 

जांच के लिए है कि क्या है यह लागू किया?

USE YourDatabaseName; 
GO 
DBCC useroptions 

MSDN कहते हैं:

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

मुझे उम्मीद है कि यह आपकी मदद करेगा।

+0

@usr नोप। यहां मेरा मतलब डिफ़ॉल्ट अलगाव स्तर को नहीं बदला गया है। अगर कोई डीबी (या एसक्यूएल सर्वर) के अलगाव स्तर को बदलना चाहता है तो वे डीबी पक्ष पर ऐसा कर सकते हैं। इसे पृथक स्तर देकर ef कोड पर करने की आवश्यकता नहीं है "Serializable "या कुछ और.यह पूरा मुद्दा है। मुझे लगता है कि मैं सही हूँ? – Sampath

+0

वैसे मैं प्रबंधन स्टूडियो में टीएसक्यूएल कमांड का प्रयास करता हूं, लेकिन जब मैं बाहर निकलता हूं और फिर से प्रवेश करता हूं, अलगाव स्तर पढ़ा जाता है। मैं अलगाव स्तर हमेशा के लिए कैसे सेट कर सकते हैं? –

+0

@ डेमोक मैंने अपनी पोस्ट अपडेट की है। कृपया जांचें। – Sampath

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