ईएफ दौड़ की स्थिति को रोकने

मैं अपने आवेदन में EF 6 और कोड प्रथम डेटाबेस समाधान का उपयोग कर रहा हूं। एक ही एप्लीकेशन कई कंप्यूटरों पर चलता है और उसी डेटाबेस तक पहुंचता है। इन अनुप्रयोगों से डेटाबेस में एक इंटीजर फ़ील्ड अपडेट किया गया है, इस फ़ील्ड का मान कम हो गया है। कोड नीचे है और मुझे लगता है कि यहां दौड़ की स्थिति समस्या हो सकती है। आप इस स्थिति में समस्या का समाधान कैसे करते हैं?

public partial class CaContext
{
   public override int SaveChanges()
   {
    var addedStatistics = ChangeTracker.Entries().Where(e => e.State == EntityState.Added).ToList().Select(p => p.Entity).ToList();

    var testOrders = GetUser.Orders.First();
    testOrders.Credits = testOrders.Credits - addedStatistics.Count; //Race condition here


     return base.SaveChanges();
   }
}
0
कृपया अधिक विस्तृत व्याख्या करें ?!
जोड़ा लेखक Tomas, स्रोत
एक DbContext थ्रेडसेफ नहीं है , इसलिए दौड़ की स्थिति कम से कम है आपकी समस्याओं का
जोड़ा लेखक Kirk Woll, स्रोत

3 उत्तर

  1. मैं समग्र डिज़ाइन को देखता हूं और ऐसे काउंटर को हटा देता हूं। उदाहरण के लिए, आप एक टेबल बना सकते हैं, जहां आप परिवर्तनों को सहेजते समय हर बार एक नया रिकॉर्ड जोड़ देंगे। आप वहां गिनती सेट करते हैं और फिर एक एसयूएम क्वेरी के साथ आपको कुल मिलता है। यह समस्या को खत्म कर देगा।

  2. यदि आप वास्तव में ऐसा क्षेत्र चाहते हैं, तो आप एक संग्रहित प्रो बना सकते हैं और उसे कॉल कर सकते हैं। एसपी डेटाबेस पर चलाया जाएगा और डेटा तक पहुंच सिंक्रनाइज़ किया जाएगा।

0
जोड़ा

एक विकल्प एक अद्यतन कथन करना होगा जो पढ़ने, गणना करने, लिखने के बजाय मूल्य को कम करता है।

Database.SqlCommand(
  @"UPDATE [CreditCount] 
    SET [Credits] = [Credits] - x 
    WHERE [UserID] = y"
);
0
जोड़ा

एक लेनदेन स्कोप के अंदर अपने परिचालन करें (संभवतः आपको सही अलगाव स्तर निर्धारित करना होगा)। तो बस एक बचत लेनदेन में SaveChanges() कॉल को लपेटें:

public void method() {
    using(var transactionScope = new TransactionScope()) {
        _context.SaveChanges();
    }
}

You will find more here: http://msdn.microsoft.com/en-us/data/dn456843#transactionScope

0
जोड़ा
अलगाव स्तर इस तरह काम नहीं करेगा। जब वह वर्तमान मूल्य पढ़ता है तो उसे होल्डॉक की तरह टेबल हिंड जोड़ना होगा। मुझे यकीन है कि अगर यह ईएफ के माध्यम से संभव है।
जोड़ा लेखक Vladimir Perevalov, स्रोत