6

यह एक समस्या है जो मेरे लिए 3 परियोजनाओं पर मौजूद है।डिफ़ॉल्ट निबर्ननेट अलगाव स्तर (उदाहरण के लिए मैपिंग के माध्यम से) सेट नहीं कर सकता

<property name="connection.isolation">ReadCommitted</property> 

hibernate.cfg.xml

में सेट धाराप्रवाह nhiberate का उपयोग करना::

मैं निम्नलिखित की कोशिश की है

MsSqlConfiguration.MsSql2008.IsolationLevel(IsolationLevel.ReadCommitted); 

global.asax.cs में सेट

मुझे हमेशा इसे इस तरह सेट करने के लिए मजबूर किया गया है:

CurrentNhibernateSession.Transaction.Begin(IsolationLevel.ReadCommitted); 

जो काम करता है। (मैं इसे NHibernate प्रोफाइलर का उपयोग करके देख सकता हूं)

समस्या अब मैं तेज वास्तुकला और लेनदेन का उपयोग कर रहा हूं। उस ढांचे के अंदर बेबीन को बुलाया जाता है और मुझे इसे पुनर्निर्माण में परेशानी हो रही है।

क्या ऐसा करने का कोई तरीका है जो लेनदेन शुरू करते समय इसे स्पष्ट रूप से सेट किए बिना काम करता है?

उत्तर

7

आप निश्चित हैं कि यह मामला है? यदि आप केवल एनएचप्रोफ आपको बता रहे हैं कि अलगाव स्तर की पुष्टि कर रहे हैं; यह एक समस्या हो सकती है। याद रखें कि एनएचप्रोफ केवल रिपोर्ट कर रहा है कि एनएचबेर्नेट में लॉगिंग इंफ्रास्ट्रक्चर इसे खिलाता है। जब आप डिफ़ॉल्ट रूप से लेनदेन खोलते हैं तो शायद अलगाव स्तर संदेश भेजा नहीं जाता है? यह शायद NHibernate स्रोत की जांच करके सत्यापित किया जा सकता है।

मैं यह निष्कर्ष निकालने से पहले लेनदेन स्तर (शायद एसक्यूएल प्रोफाइलर?) को सत्यापित करने के लिए वैकल्पिक साधनों का उपयोग करने का सुझाव दूंगा कि यह उम्मीद के अनुसार काम नहीं कर रहा है।

संपादित करें:

मैं NHibernate स्रोत पर एक नज़र लिया है और इसके बाद के संस्करण मेरी कूबड़ सत्यापित कर सकते हैं। यदि आपने AdoTransaction स्रोत पर एक नज़र डाली है तो आप ध्यान दें कि यह अलगाव स्तर के अलगाव स्तर को लॉग कर रहा है। विशिष्ट अलगाव स्तर निर्दिष्ट किए बिना लेनदेन शुरू होने पर निर्दिष्ट नहीं किया गया है।

// This is the default overload you're calling: 
public void Begin() 
{ 
Begin(IsolationLevel.Unspecified); 
} 

// This is the full method impl 
public void Begin(IsolationLevel isolationLevel) 
{ 
// snip.... 

// This is the problematic line here; it will report an isolationLevel of Unspecified. 
log.Debug(string.Format("Begin ({0})", isolationLevel)); 

// snip... 

} 

हालांकि, वास्तविक लेन-देन अलगाव स्तर कुछ लाइनें नीचे config में निर्दिष्ट इस तरह के रूप के साथ शुरू किया जा रहा है:

if (isolationLevel == IsolationLevel.Unspecified) 
{ 
isolationLevel = session.Factory.Settings.IsolationLevel; 
} 

इसलिए, यह प्रतीत होता है कि NHProf में पूरी तरह से सही नहीं किया जा रहा है यह उदाहरण

अद्यतन:

ऐसा प्रतीत होता है इस NHibernate के ट्रंक संस्करण में तय किया गया है, इसलिए मैं अब यह NHibernate 3.xx. साथ कोई समस्या है अनुमान लगा रहा हूँ

+0

बहुत बढ़िया जवाब! धन्यवाद! – Alistair

+0

@Alistair: मैंने एनएचप्रोफ समूह में भी इसका उल्लेख किया है, लेकिन मुझे लगता है कि एनएच 2.x उपयोगकर्ताओं के लिए इसके बारे में कुछ भी नहीं किया जा सकता है ... http://groups.google.com/group/nhprof/browse_thread/धागा/b8ceb8f8c1cdb4d3 – DanP

0

लगता है कि आपके प्रॉपर्टी सेटिंग की तरह hibernate.connection.isolation बुलाया जाना चाहिए ...

<add key="hibernate.connection.isolation" value="ReadCommitted" /> 

सादर

जॉन

+2

यदि आपके वेब.कॉन्फिग में आपकी निबर्ननेट सेटिंग्स हैं तो यह आवश्यक है। यदि आपके पास उन्हें बाहरी फ़ाइल में है तो आप ऊपर निर्दिष्ट प्रारूप का उपयोग करते हैं। – Alistair

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