2011-05-23 15 views
5

मेरे पास एक एस # एआरपी आर्किटेक्चर ऐप है जो हल्के कतार-प्रसंस्करण की चीज लागू करता है जिससे विभिन्न धागे एक सूची से इकाइयों को खींचते हैं और इस स्थिति को चिह्नित करने के लिए अपनी स्थिति निर्धारित करते हैं कि उन वस्तुओं पर प्रसंस्करण शुरू हो गया है।NHibernate Concurrency समस्या

स्पष्ट लेन-देन में प्रारंभ-प्रसंस्करण बिट को लपेटने और सी # लॉक() का उपयोग करने के बावजूद, मैं अब भी उन्हें कभी-कभी एक ही समय में शुरू करता हूं।

क्या मुझे एमएसएमक्यू का उपयोग नहीं करना पछतावा है ... अच्छा, हाँ, लेकिन अब इस सहमति के व्यवहार ने मुझे परेशान कर दिया है। जाहिर है ऐसा कुछ है जिसे मैं एनएचबीर्नेट लेनदेन और फ्लशिंग के बारे में नहीं समझता। क्या तुम मेरी मदद कर सकते हो?

यहाँ कोड के प्रासंगिक बिट है:

private static object m_lock = new object(); 

private bool AbleToStartProcessing(int thingId) 
{ 
    bool able = false; 
    try 
    { 
     lock (m_lock) 
     { 
      this.thingRepository.DbContext.BeginTransaction(); 
      var thing = this.thingRepository.Get(thingId); 
      if (thing.Status == ThingStatusEnum.PreProcessing) 
      { 
       able = true; 
       thing.Status = ThingStatusEnum.Processing; 
      } 
      else 
      { 
       logger.DebugFormat("Not able to start processing {0} because status is {1}", 
         thingId, thing.Status.ToString()); 
      } 
      this.thingRepository.DbContext.CommitTransaction(); 
     } 
    } 
    catch (Exception ex) 
    { 
     this.thingRepository.DbContext.RollbackTransaction(); 
     throw ex; 
    } 
    if (able) 
     logger.DebugFormat("Starting processing of {0}", 
         thingId); 
    return able; 
} 

मैं इस अपेक्षा की होगी गारंटी नहीं है कि केवल एक धागा एक समय में एक 'बात' का दर्जा बदल सकता है, लेकिन मैं बहुत अपने लॉग में इस मिल नियमित रूप से:

2011-05-18 18:41:23,557 thread41 DEBUG src:MyApp.Blah.ThingJob - Starting processing of 78090 
2011-05-18 18:41:23,557 thread51 DEBUG src:MyApp.Blah.ThingJob - Starting processing of 78090 

.. और फिर दोनों धागे एक ही चीज़ पर कोशिश करते हैं और काम करते हैं और गड़बड़ करते हैं।

मुझे क्या याद आ रही है? धन्यवाद।

संपादित करें: कैसे मेरे लॉगिंग अपने NHibernate मैपिंग में वास्तविक संस्करण

+0

क्या आप इसे समझने में सक्षम थे? –

+0

हैवेन्ट को अभी तक आपके सुझावों का प्रयास करने का मौका मिला है, लेकिन मैं जल्द ही इसे जल्द ही दूंगा। – codeulike

उत्तर

1

सेटअप संगामिति में काम करता है को प्रतिबिंबित करने के कोड बदल गया है, इस पोस्ट की मदद करनी चाहिए आप आरंभ।

http://ayende.com/blog/3946/nhibernate-mapping-concurrency

+0

वाह, क्या इसका मतलब यह है कि निबर्ननेट लेनदेन कोड तब तक कुछ नहीं करता जब तक कि समवर्ती विकल्प कहीं भी सेट न हो जाए? – codeulike

+0

मुझे यकीन नहीं है, लेकिन अगर आप अपनी मैपिंग सेट अप नहीं करना चाहते हैं तो आप इसे आजमा सकते हैं। 'session.Lock (चीज़, LockMode.Upgrade);' –

0

मुझे लगता है कि तुम सिर्फ स्थिति आप स्थापित करने के लिए है कि आप कार्रवाई कर रहे हैं और कहा कि आप पहले से ही कार्रवाई कर रहे हैं की जाँच करने के प्रयोग कर रहे हैं पर पार कर रहे हैं। ThingStatusEnum.Processing सेट में पहला वाला, लेकिन अगला आदमी कुछ अलग-अलग जांच कर रहा है - ThingStatusEnum.PreProcessing। क्योंकि ThingStatusEnum.Processing! = ThingStatusEnum.PreProcessing, आपके लॉकिंग का मतलब है कि दो धागे

+0

लेकिन मुझे नहीं मिलता है, भले ही कोई तार्किक समस्या हो, भले ही लॉगर एक ही समय में रिपोर्ट करता है यदि यह महत्वपूर्ण अनुभाग में लॉग इन कर रहा है। यह हो सकता है कि लॉगर स्वयं सटीक नहीं है (Log4net?)। हो सकता है कि लॉग को समय बिताने का प्रयास करें, और देखें कि क्या वे वास्तव में टकराते हैं, जो असंभव लगता है। – Ernesto

+0

इससे पहले नहीं देखा था कि समय बिल्कुल वही थे। आप सही हैं, यह इंगित करता है कि यह एक साथ चल रहा है। स्थैतिक लॉक ऑब्जेक्ट के साथ संभव नहीं होना चाहिए। निबर्ननेट या एस # आर्क वास्तुकला के साथ कुछ भी नहीं है। किसी भी डेटाबेस इंटरैक्शन के बावजूद एकाधिक थ्रेड उसी कोड को उसी समय चलाने में सक्षम नहीं होना चाहिए। अगर लॉक ऑब्जेक्ट स्थिर नहीं था, तो मुझे लगता है कि आप अलग-अलग उदाहरणों से निपट रहे थे, लेकिन मेरे पास आपके लिए कोई जवाब नहीं है। मैं अभी भी कहता हूं कि स्थिति पर चेक में कोई दोष है, लेकिन मैं लॉग में समय की व्याख्या नहीं कर सकता। –

+0

@ अर्नेस्टो, @ डेव - ओह, क्षमा करें दोस्तों, मैंने कोड को सरल बना दिया जब मैंने इसे यहां पोस्ट किया, और लॉग स्टेटमेंट को स्थानांतरित कर दिया। मेरे संस्करण में लॉकिंग लॉक के बाहर होता है - आप सही हैं कि पोस्ट कोड के साथ एक ही समय में दो लॉग असंभव हैं। मैं सवाल संपादित करूंगा। – codeulike