2013-03-12 5 views
9

मैं एक डीबी पर एक बहु थ्रेड प्रोसेसर के लॉग को सहेजने की कोशिश कर रहा हूं लेकिन मुझे निम्न त्रुटि मिल रही है: नया लेनदेन अनुमति नहीं है क्योंकि सत्र में अन्य धागे चल रहे हैं।इकाई फ्रेमवर्क नए लेनदेन की अनुमति नहीं है क्योंकि सत्र में चल रहे अन्य थ्रेड हैं, मल्टी थ्रेड

internal bool WriteTrace(IResult result, string message, byte type) 
    { 
     SPC_SENDING_TRACE trace = new SPC_SENDING_TRACE(
         message, 
         Parent.currentLine.CD_LINE, 
         type, 
         Parent.currentUser.FULLNAME, 
         Parent.guid); 
     Context.SPC_SENDING_TRACE.AddObject(trace); 
     if (Context.SaveChanges(result) == false) 
      return false; 
     return true; 

    } 

प्रसंग प्रत्येक थ्रेड के लिए अलग अलग है, लेकिन डीबी के संबंध हमेशा एक ही है:

प्रत्येक चलने में

मैं इस समारोह की है।

इस समस्या को हल करने का कोई तरीका है?

आप एंड्रिया

उत्तर

34

धन्यवाद आप प्रत्येक लेनदेन के लिए एक संदर्भ बनाने चाहिए और फिर इसे निपटाने, आपको लगता है कि इस तरह से कर सकते हैं: बंद ब्रैकेट संदर्भ निपटान किया जाता है के बाद

using(var ctx = new MyContext()) { 
    //do transaction here 
} 

बेहतर समझने के लिए this post देखें जहां आप ken2k द्वारा एक अच्छा उत्तर प्राप्त कर सकते हैं। आशा है कि आप आप इस मुद्दे को ठीक कर सकते हैं :)

अद्यतन:

तुम भी हर LINQ क्वेरी आपके पास करने के लिए .ToList() जोड़ने का प्रयास करना चाहिए। जब आप LINQ परिणाम पर पुन: प्रयास करते हैं, तो आप पुनरावृत्ति समाप्त होने तक कोई भी परिवर्तन नहीं कर सकते हैं। जांचें कि क्या आपके पास ऐसा कुछ है या अधिक कोड साझा करें यानी कोड का टुकड़ा जहां आप WriteTrace पर कॉल करते हैं। उम्मीद है कि इस बार यह वास्तव में आपकी मदद करता है।

+0

अभी भी वही त्रुटि है, मेरे पास मुख्य अनुप्रयोग (बहुभाषी नहीं) के लिए एक और संदर्भ है लेकिन यह मल्टीथ्रेड चल रहा है जब यह लिख नहीं रहा है। क्या यह अभी भी कुछ समस्याएं पैदा कर सकता है? – andrea

+0

@andrea के आपके मुख्य ऐप के लिए कोई अन्य संदर्भ नहीं है, जब आपको अपने डीबी से कुछ अनुरोध करने, जोड़ने, हटाने या अपडेट करने की आवश्यकता होती है, तो संदर्भ बनाने का प्रयास करें, इसे 'उपयोग' के साथ करें जैसा कि मैंने आपको प्रत्येक के जवाब में बताया था ** सिंगल ** लेनदेन और यदि यह ठीक नहीं करता है, तो 'संदर्भ' में 'लॉक' जोड़ें। सेव चेंज() '। उम्मीद है कि मदद करता है, हालांकि मुझे यकीन नहीं है कि यह करता है, तो, शुभकामनाएँ !!! कृपया उत्तर दें;) – ecampver

+0

@andrea मेरी आखिरी टिप्पणी भूल जाओ, पहले मेरे उत्तर अपडेट को आजमाएं। – ecampver

0

मैं एक बहु थ्रेडेड वातावरण में इकाई ढांचे का उपयोग करता हूं, जहां कोई थ्रेड, यूई और पृष्ठभूमि (दोनों एसटीए और एमटीए), एक ही डेटाबेस को समवर्ती रूप से अपडेट कर सकते हैं। मैंने किसी भी नए पृष्ठभूमि धागे पर उपयोग की शुरुआत में स्क्रैच से इकाई कनेक्शन को दोबारा बनाकर इस समस्या का समाधान किया। इकाई कनेक्शन उदाहरण की जांच करना कनेक्शनस्ट्रिंग एक पाठक guid दिखाता है जो मुझे लगता है कि सामान्य कनेक्शन उदाहरणों को जोड़ने के लिए उपयोग किया जाता है। स्क्रैच से इकाई कनेक्शन को पुनर्निर्मित करके ग्रिड मान प्रत्येक थ्रेड के लिए अलग होते हैं और कोई संघर्ष नहीं होता है।

// Build the connection string. 

    var sqlBuilder = new SqlConnectionStringBuilder(); 
    sqlBuilder.DataSource = serverName; 
    sqlBuilder.InitialCatalog = databaseName; 
    sqlBuilder.MultipleActiveResultSets = true; 
    ... 
    var providerString = sqlBuilder.ToString(); 
    var sqlConnection = new SqlConnection(providerString); 

// Build the emtity connection. 

    Assembly metadataAssembly = Assembly.GetExecutingAssembly(); 
    Assembly[] metadataAssemblies = { metadataAssembly }; 
    var metadataBase = @"res://*/{0}.csdl|res://*/{0}.ssdl|res://*/{0}.msl"; 
    var dbModelMetadata = String.Format(metadataBase, objectContextTypeModelName); 
    // eg: "res://*/Models.MyDatabaseModel.csdl|res://*/Models.MyDatabaseModel.ssdl|res://*/Models.MyDatabaseModel.msl" 
    var modelMetadataPaths = modelMetadata.Split('|'); 
    var metadataWorkspace = new MetadataWorkspace(modelMetadataPaths, metadataAssemblies); 
    var entityDbConnection = new EntityConnection(metadataWorkspace, sqlConnection); 
    return entityDbConnection; 
+0

कृपया अपने उत्तर के बहुमत को विभिन्न प्रश्नों की प्रतिलिपि बनाएँ और पेस्ट न करें। – Andy

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