2011-02-08 10 views
5

पर अपग्रेड करें लेनदेन के अंदर निबर्ननेट और एडीओ.Net संचालन का उपयोग करते समय मुझे निम्नलिखित अपवाद मिल रहा है Scope.Eg। यह निबर्ननेट 2.1 के साथ ठीक था लेकिन अब 3.0 तक अपग्रेड किया गया है जो त्रुटि फेंकता है।ट्रांज़ेक्शनस्कोप त्रुटि के साथ निबर्ननेट - डीटीसी लेनदेन प्रीपेर चरण विफल - निबर्ननेट 3.0

using (var scope = new TransactionScope(TransactionScopeOption.Required)) 
{ 
     GetmemberId(); --> NHibernate Call 
     Update(); ADO Call OracleDB 
} 

के बाद से इस रूप में परिवेश लेन-देन में कार्य करता है, Nhibernate जल्द ही लेन-देन निपटाने की कोशिश करता है से पहले बाहरी लेन-देन मुझे completes.correct अगर मैं गलत हूँ, वहाँ किसी भी समाधान मेरी मदद क्योंकि है, लेकिन जब मैं Nhibernate कॉल के बाहर ले जाने के TransactionScope सब कुछ ठीक काम करता है। उदाहरण मैं दे दिया है नमूना एक है, खानों, एक अधिक जटिल एक शामिल है के बाद से मैं दोनों TransactionScope अंदर कॉल और त्रुटि Iam मिलती रहती है, 13 NHibernate.Impl.AbstractSessionImpl निम्नलिखित के रूप में है

त्रुटि - डीटीसी लेनदेन प्रीपे चरण विफल हुआ सिस्टम। ऑब्जेक्ट डिस्प्ले अपवाद: एक डिस्पोजेड ऑब्जेक्ट तक नहीं पहुंच सकता है। ऑब्जेक्ट का नाम: 'लेनदेन'। System.Transactions.Transaction.DependentClone System.Transactions.TransactionScope.SetCurrent पर (DependentCloneOption cloneOption) (लेन-देन newCurrent) System.Transactions.TransactionScope.PushScope पर()
System.Transactions.TransactionScope.Initialize में (लेन-देन पर transactionToUse, TimeSpan scopeTimeout, बूलियन interopModeSpecified) System.Transactions.TransactionScope..ctor में (लेन-देन transactionToUse) NHibernate.Transaction.AdoNetWithDistributedTransactionFactory.DistributedTransactionContext.System.Transactions.IEnlistmentNotification.Prepare (preparingEnlistment preparingEnlistment पर) 2011-02- 08 13: 41: 46,033 त्रुटि 13 NHibernate.Impl.AbstractSessionImpl - डीटीसी लेनदेन प्रीपेर चरण विफल सिस्टम। ऑब्जेक्ट डिस्प्ले अपवाद: एक डिस्पोजेड ऑब्जेक्ट तक नहीं पहुंच सकता है। ऑब्जेक्ट का नाम: 'लेनदेन'। System.Transactions.Transaction.DependentClone System.Transactions.TransactionScope.SetCurrent पर (DependentCloneOption cloneOption) (लेन-देन newCurrent) System.Transactions.TransactionScope.PushScope पर()
System.Transactions.TransactionScope.Initialize में (लेन-देन पर NHibernate.Transaction.AdoNetWithDistributedTransactionFactory.DistributedTransactionContext.System.Transactions.IEnlistmentNotification.Prepare (preparingEnlistment preparingEnlistment पर System.Transactions.TransactionScope..ctor पर transactionToUse, TimeSpan scopeTimeout, बूलियन interopModeSpecified) (लेन-देन transactionToUse))

012,351,

उत्तर

6

Configuration.SetProperty(Environment.TransactionStrategy,"NHibernate.Transaction.AdoNetTransactionFactory")

प्रयास करें या nhibernate config में

<property name="transaction.factory_class"> 
NHibernate.Transaction.AdoNetTransactionFactory 
</property> 

यह मेरे लिए काम किया =)

+0

धन्यवाद! यह मेरे लिए भी काम किया! – Saxophonist

1

हम इस एक ही त्रुटि का सामना किया है, और यह तरीका के कारण हुई थी हमने NH वेबनेट के साथ हमारे वेब एपीआई में सत्र और लेन-देन का उपयोग किया।

हम सत्र-प्रति-अनुरोध का उपयोग कर रहे हैं। (यह एक वेब अनुरोध या NServiceBus हैंडलर का निष्पादन हो सकता है।) जब कोई अनुरोध शुरू होता है, तो आपको एक सत्र खोलना चाहिए और लेनदेन शुरू करना चाहिए।

हम ऐसा नहीं कर रहे थे। हमारे भंडारों में, हमने प्रत्येक डेटाबेस अनुरोध के लिए एक नया सत्र और लेनदेन बनाया। इसका मतलब था कि अनुरोध के लिए एक सत्र/लेनदेन करने के बजाय, हमारे पास बहुत से थे।

हमारे लिए बग का मूल कारण यह था कि हम एक सत्र में एक इकाई (डोमेन मॉडल ऑब्जेक्ट) लोड कर रहे थे, इसे संशोधित कर रहे थे, और एक अलग सत्र का उपयोग करके इसे सहेज रहे थे। जब तक NHibernate ने अद्यतन कॉल निष्पादित किया, तब तक लोडिंग सत्र/लेनदेन पहले से ही किया गया था, फ्लश किया गया था, और बंद कर दिया गया था।

समाधान हमारे सत्र/लेनदेन निर्माण को रिपॉजिटरीज़ से बाहर और नियंत्रक परत तक खींचना था (आरईएसटी कॉल के लिए एक एचटीपी मॉड्यूल का उपयोग करने योग्य और/या निर्भरता इंजेक्शन का उपयोग करके पहलू उन्मुख प्रोग्रामिंग के साथ)। यह एक सत्र/लेनदेन फिर आरईएसटी कॉल या एनएस सर्विसबस हैंडलर निष्पादन के जीवनकाल के लिए रहता है और उस कॉल के दौरान सभी डेटाबेस पहुंच के लिए उपयोग किया जाता है। जब वह कॉल समाप्त होता है, तो यह उचित या वापस उचित रूप से लुढ़का जाएगा।

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

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