2012-03-23 13 views
6

के साथ OptimisticConcurrencyException मैं SQL सर्वर में सत्र के लिए Microsoft से Universal Providers का उपयोग कर रहा हूं। SQL सर्वर पर सत्र के पुराने कार्यान्वयन की अवधि समाप्त होने के लिए नौकरी (हर मिनट चल रही) की आवश्यकता होती है। नया यह हर अनुरोध पर यह जांच और स्पष्ट करता है। चूंकि मैं वास्तव में एसक्यूएल एज़ूर में चल रहा हूं, मेरे पास जॉब शेड्यूल करने के लिए एसक्यूएल एजेंट नहीं है, इसलिए यह इसके बारे में जाने के लिए एक उचित तरीका लगता है (नहीं, मैं सत्र के लिए एज़ूर कैश के लिए भुगतान नहीं करना चाहता)।System.Web.Providers

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

System.Data.OptimisticConcurrencyException: Store update, insert, or delete statement affected an unexpected number of rows (0). Entities may have been modified or deleted since entities were loaded. Refresh ObjectStateManager entries. 
    at System.Data.Mapping.Update.Internal.UpdateTranslator.Update(IEntityStateManager stateManager, IEntityAdapter adapter) 
    at System.Data.Objects.ObjectContext.SaveChanges(SaveOptions options) 
    at System.Web.Providers.DefaultSessionStateProvider.PurgeExpiredSessions() 
    at System.Web.Providers.DefaultSessionStateProvider.PurgeIfNeeded() 
    at System.Web.SessionState.SessionStateModule.BeginAcquireState(Object source, EventArgs e, AsyncCallback cb, Object extraData) 
    at System.Web.HttpApplication.AsyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() 
    at System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) 

मैं त्रुटि लॉगिंग के लिए ELMAH का उपयोग कर रहा हूं, और यह कुछ आवृत्ति के साथ दिख रहा है। त्रुटियों को अनदेखा करने के लिए ELMAH को कॉन्फ़िगर करने का प्रयास करने से पहले, क्या किसी को भी पहली जगह त्रुटियों को रोकने से रोकने का तरीका पता है? क्या नए प्रदाताओं के साथ कुछ विन्यास है जो मुझे याद आ रही है?

+0

मुझे भी एक ही समस्या का सामना करना पड़ रहा है। क्या आपको पता चला है कि इस मुद्दे को कैसे ठीक किया जाए? एकमात्र तरीका मैं सोच सकता हूं कि कोड को कम करना है? कोई सुझाव – chugh97

+2

सबसे अच्छा मैं बता सकता हूं, माइक्रोसॉफ्ट वास्तव में इन प्रदाताओं का समर्थन नहीं कर रहा है। मेरे में cynic का कहना है कि वे Azure उपयोगकर्ताओं को कैश के लिए भुगतान करने की कोशिश कर रहे हैं। मैं किसी को गलत साबित करने के लिए प्यार करता हूँ। अंत में, हमने इसे छोड़ दिया और सीधे SQL सर्वर प्रदाता पर वापस चला गया। हमें पहले से ही अन्य असंबंधित नौकरियों को शेड्यूल करने के लिए एक और सर्वर की आवश्यकता है, इसलिए हमने वहां समाशोधन समाप्त होने वाली सत्र नौकरी भी दी है। क्षमा करें मेरे पास रिपोर्ट करने के लिए कुछ भी बेहतर नहीं है। – icrf

+0

क्या आपने इस समस्या का समाधान किया है? मैं खुद को एक ही मुद्दे में चला रहा हूं। – onit

उत्तर

1

इस पैकेज में एक बग के रूप में वर्णन किया गया है। प्रक्रिया सत्र स्थिति से बाहर का आधार यह है कि कई उदाहरण सत्र स्थिति को साफ कर सकते हैं। इस मामले में सभी उदाहरणों इस विधि द्वारा चलाए जा रहे ...

private void PurgeExpiredSessions() 
{ 
    using (SessionEntities entities = ModelHelper.CreateSessionEntities(this.ConnectionString)) 
    { 
     foreach (SessionEntity entity in QueryHelper.GetExpiredSessions(entities)) 
     { 
      entities.DeleteObject(entity); 
     } 
     entities.SaveChanges(); 
     this.LastSessionPurgeTicks = DateTime.UtcNow.Ticks; 
    } 
} 

समस्या यह है कि एक उदाहरण (रों) अन्य से पहले संस्थाओं को हटा देता है और संस्थाओं पोस्ट में वर्णित त्रुटि फेंकता है। मैं स्रोत कोड जारी या इसे ठीक करने के पैकेज लेखकों को कहा .. मेरे अपरीक्षित पाठ संपादक ठीक सार्वजनिक आभासी जोड़ने के लिए है, तो एक विधि को रद्द कर सकते हैं या सिर्फ यह भी बदल होगा ..

private void PurgeExpiredSessions() 
{ 
    using (SessionEntities entities = ModelHelper.CreateSessionEntities(this.ConnectionString)) 
    { 
     var sqlCommand = @"DELETE dbo.Sessions WHERE Expires < GETUTCDATE()"; 
     entities.ExecuteStoreCommand(sqlCommand); 
     this.LastSessionPurgeTicks = DateTime.UtcNow.Ticks; 
    } 
} 

पैकेज लेखकों प्रतिक्रिया के साथ वास्तव में तेज़ हैं (इसे पोस्ट करते समय उत्तर दिया गया!) और आज उन्होंने कहा कि वे कोड जारी करने पर काम कर रहे हैं लेकिन वे इसे ठीक करने में सक्षम हो सकते हैं। मैंने एक ईटीए से अनुरोध किया और यदि मैं एक प्राप्त करता हूं तो यहां का पालन करने का प्रयास करूंगा।

ग्रेट पैकेज, इसे केवल थोड़ा रखरखाव की आवश्यकता है।

उचित उत्तर: स्रोत कोड रिलीज़ या फ़िक्स अपडेट के लिए प्रतीक्षा करें। या डी-संकलित करें और इसे स्वयं ठीक करें (यदि वह लाइसेंस के अनुरूप है!)

* पैकेज मालिक अपडेट करें इस सप्ताह इसे ठीक करने पर विचार कर रहे हैं। हाँ! * * अद्यतन। हल किया गया !!! उन्होंने स्पष्ट रूप से इसे थोड़ी देर पहले तय किया था और मैं गलत पैकेज स्थापित कर रहा था .. मैं http://nuget.org/packages/System.Web.Providers का उपयोग कर रहा था और मुझे http://nuget.org/packages/Microsoft.AspNet.Providers/ का उपयोग करना चाहिए था .. यह मेरे लिए स्पष्ट नहीं था कि कौन सा विरासत था और दूसरे पैकेज में शामिल था। उन्होंने इसे खाली पकड़ में लपेट लिया ..

private void PurgeExpiredSessions() 
{ 
    try 
    { 
     using (SessionEntities entities = ModelHelper.CreateSessionEntities(this.ConnectionString)) 
     { 
      foreach (SessionEntity entity in QueryHelper.GetExpiredSessions(entities)) 
      { 
       entities.DeleteObject(entity); 
      } 
      entities.SaveChanges(); 
      this.LastSessionPurgeTicks = DateTime.UtcNow.Ticks; 
     } 
    } 
    catch 
    { 
    } 
} 

ऐसे त्वरित प्रतिक्रियाओं और महान समर्थन के लिए पैकेज टीम के लिए धन्यवाद !!!

+0

** अद्यतन करें। हमने Azure में लगभग 250 एक साथ उपयोगकर्ताओं के साथ यह कोशिश की और एसक्यूएल एज़ूर ने हमें त्रुटि संदेश दिए जो कहा कि भौतिक मशीन किसी और कनेक्शन को स्वीकार नहीं कर सकती है, भले ही हम हमारी अनुमति सीमा सीमा के भीतर हों। मेरा फैसला Azure में इस प्रकार के सत्र प्रबंधन से बचने के लिए है। बीटीडब्ल्यू ने इसका एकमात्र कारण यह प्रयास किया क्योंकि हमारा वर्तमान सत्र राज्य बैकर, एज़ूर कैशिंग, बहुत अधिक आबादी था। – TheDev6

2

कृपया प्रदाताओं के नए संस्करण को डाउनलोड करें जो यहां पाए जा सकते हैं: http://www.nuget.org/packages/System.Web.Providers। हमने इस तरह से अद्यतन किया है कि हम समय-समय पर चलने वाले सत्रों को अतुल्यकालिक रूप से चलाने और त्रुटि स्थितियों को संभालने के लिए साफ़ करते हैं। कृपया हमें बताएं कि क्या यह आपके मुद्दों को सही नहीं करता है।

+0

अद्यतन के लिए धन्यवाद। मैं अपने वर्तमान प्रोजेक्ट को समाप्त करने के बाद इस सप्ताह के अंत में या इसके बाद के बाद इसे देखने की कोशिश करूंगा। क्या कोई सार्वजनिक परिवर्तन लॉग उपलब्ध है? जबकि मैंने सत्र को डिफ़ॉल्ट प्रदाताओं से दूर ले जाया, मैं अभी भी सदस्यता/भूमिकाओं का उपयोग कर रहा हूं। – icrf

+0

मैं इसे समाधान के रूप में चिह्नित कर रहा हूं, लेकिन मैंने यह जांचने के लिए परीक्षण नहीं किया है कि यह वास्तव में समस्या को हल करता है या नहीं। हम सत्र के लिए एज़ूर कैशिंग पूर्वावलोकन में चले गए हैं, इसलिए इसका परीक्षण अब मेरे लिए संभव नहीं है। – icrf

+0

मेरे पास एसक्यूएल एज़ूर और नवीनतम नुजेट जून 2012 का उपयोग करके एक ही समस्या है। मेरे मामले में मैं एज़ूर सह स्थित कैशिंग से बच रहा हूं क्योंकि इसने भंडारण विफलता (कैश स्टेट मैनेजर) और नए उदाहरणों के कारण कई नए कारणों को नए आईपी पते के आश्रित उदाहरणों को अपडेट नहीं किया है (एज़ूर में विफलता के कई अज्ञात एकल बिंदु हैं)। स्कॉट, यह यूनिवर्सल प्रदाता पैकेज बहुत अच्छा है! हालांकि त्रुटि पर कोई फॉलो अप? ऐसा लगता है कि अजीब में दो उदाहरणों में से एक दूसरे को PurgeExpiredSessions() को धड़कता है। – TheDev6

1

मैंने NuGet (http://www.nuget.org/packages/System.Web.Providers) पर इस पर एक प्रश्न पोस्ट किया, और मालिकों से बहुत तेज प्रतिक्रिया मिली। पीछे और आगे के बाद, यह पता चला कि उनके पास एक फिक्स है, लेकिन अगले अपडेट में बाहर जा रहा है।

यहां एक सुझाव दिया गया था कि माइक्रोसॉफ्ट इसका समर्थन करने के लिए बहुत उत्सुक नहीं है, लेकिन मेरा अनुभव अन्यथा रहा है, और हमेशा अच्छा समर्थन प्राप्त हुआ है।

+0

"एक प्रश्न पोस्ट किया गया" से आपका मतलब है "पैकेज के मालिक से संपर्क करें" या NuGet पर प्रश्न पोस्ट करने के लिए कोई और तरीका है? कई अन्य माइक्रोसॉफ्ट परियोजनाएं कोडप्लेक्स या Google कोड या गिथब पर हैं, और उनमें सभी के पास समस्या ट्रैकर्स और चर्चा प्रणाली हैं। मुझे खुली चर्चा के लिए कहीं भी यह परियोजना नहीं मिल सका। – icrf