मेरे पास प्राथमिक कुंजी के साथ प्रोजेक्टएक्टिविटी नाम की एक तालिका है: प्रोजेक्टकोड और गतिविधि आईडी और प्रोजेक्टकोड पर इंडेक्स हमारी वेबसाइटें इस तालिका पर क्वेरी उत्पन्न करती हैं (अन्य तालिकाओं को शामिल किए बिना) और हमेशा उसी प्रोजेक्टकोड के साथ पंक्तियों का अनुरोध करती हैं

कभी-कभी हम सी # में एक नौकरी शुरू करते हैं जो एक विशिष्ट प्रोजेक्ट कोड के साथ प्रत्येक पंक्तियों को हटा देता है और लेनदेन में उस विशिष्ट प्रोजेक्टकोड के लिए नई पंक्तियां सम्मिलित करता है।

            using (var dbContextTransaction = db.Database.BeginTransaction())
        {
            try
            {

                db.Database.ExecuteSqlCommand("delete FROM [TS_Repository].[dbo].[ProjectActivities] where ProjectCode = {0} ", project.Code);

                LogManager.WriteRequestLog("Deleted Existing Project Activities");

                if (ProjectActivities.Count > 0)
                {
                    db.Set<ProjectActivity>().AddRange(ProjectActivities);
                    db.SaveChanges();

                }

                dbContextTransaction.Commit();

                LogManager.WriteRequestLog("Refresh ProjectActivities succesfully for " + project.Title);
            }
            catch (Exception exc)
            {

                dbContextTransaction.Rollback();
                throw exc;
            }
        }

हमारा मुद्दा यह है कि, इस लेन-देन (3/4 मिनट) के प्रसंस्करण के दौरान, हमारी वेबसाइटें कोई क्वेरी नहीं कर सकती हैं (पूरी तालिका लॉक है)। हमें यह परिदृश्य प्राप्त करना चाहिए: लेन-देन किए जाने तक, वेबसाइट को "पुराने" डेटा से पूछताछ करनी चाहिए। क्या इस परिदृश्य को लागू करना संभव है? मैं यह पता लगा सकता हूं कि हमें लॉक और आइसोलेशन स्तर के साथ छल करना है।

किसी भी सुझाव के लिए अग्रिम धन्यवाद।

0
Mike Custoza 24 अप्रैल 2018, 14:04

2 जवाब

सबसे बढ़िया उत्तर

हाँ, आप अपने प्रश्नों को एक विशेष आइसोलेशन स्तर के साथ निष्पादित कर सकते हैं जो तालिका या पंक्ति के लॉक होने पर डेटा पढ़ सकता है। मैं बिना पढ़े डेटा के जोखिमों के बारे में चर्चा में प्रवेश नहीं करूंगा, मुझे लगता है कि आप पहले से ही जानते हैं, और @iamdave ने इसके बारे में एक अच्छा लिंक साझा किया है।

जैसा कि आप अनकमिटेड डेटा को पढ़ना चाहते हैं, इसे EF के साथ करने के कुछ तरीके हैं, लेकिन इसे करने का एक सरल और स्पष्ट तरीका लेनदेन का उपयोग करना है। TransactionScope कंस्ट्रक्टर में आप IsolationLevel को इस तरह सेट कर सकते हैं:

using (new TransactionScope(
           TransactionScopeOption.Required, 
           new TransactionOptions 
           { 
              IsolationLevel = IsolationLevel.ReadUncommitted 
           })) 
{
        // here you put your code
}

यहां EF और आइसोलेशन लेवल के बारे में एक और अच्छी रीडिंग: entity-framework-and- लेन-देन-अलगाव-स्तर

0
Ricardo Pontual 24 अप्रैल 2018, 14:26

आपने मुझे सही दिशा में संबोधित किया, लेकिन मुझे लगता है कि मुझे स्नैपशॉट अलगाव स्तर की आवश्यकता है, क्योंकि मैंने निर्दिष्ट किया है कि मुझे पुरानी पंक्ति संस्करण पढ़ने की आवश्यकता है। शायद मैंने इतना अच्छा समझाया नहीं...

इसलिए, मैंने स्नैपशॉट का उपयोग करके हल किया है:

using (var dbContextTransaction = db.Database.BeginTransaction(System.Data.IsolationLevel.Snapshot))
        {
            try
            {


                db.Database.ExecuteSqlCommand("delete FROM [TS_Repository].[dbo].[ProjectActivities] where ProjectCode = {0} ", project.Code);

                LogManager.WriteRequestLog("Deleted Existing Project Activities");

                if (ProjectActivities.Count > 0)
                {
                    db.Set<ProjectActivity>().AddRange(ProjectActivities);
                    db.SaveChanges();

                }

                dbContextTransaction.Commit();

                LogManager.WriteRequestLog("Refresh ProjectActivities succesfully for " + project.Title);
            }
            catch (Exception exc)
            {

                dbContextTransaction.Rollback();
                throw exc;
            }
        }
0
Mike Custoza 24 अप्रैल 2018, 17:16