2010-09-22 11 views
5

के साथ एनएचबर्ननेट ट्रांजैक्शनस्कोप समस्या निम्न कोड स्निपेट SQL सर्वर 2008 (SP1) के साथ ठीक काम करता है लेकिन ओरेकल 11 जी सत्र के लिए कॉल के साथ। बेगिनट्रांसक्शन() संदेश के साथ अपवाद फेंकता है 'कनेक्शन पहले से ही स्थानीय या एक का हिस्सा है वितरित लेनदेन '(नीचे दिखाया गया ढेर निशान)। 'NHHernate.Driver.OracleDataClientDriver' का प्रयोग करना।ओरेकल 11 जी

क्या कोई और इसमें भाग लेता है?

using (var scope = new TransactionScope()) 
{ 
    using (var session = sessionFactory.OpenSession()) 
    using (var transaction = session.BeginTransaction()) 
    { 
     // do what you need to do with the session 
     transaction.Commit(); 
    } 
    scope.Complete(); 
} 
 
    Exception at: at NHibernate.Transaction.AdoTransaction.Begin(IsolationLevel isolationLevel) 
      at NHibernate.Transaction.AdoTransaction.Begin() 
      at NHibernate.AdoNet.ConnectionManager.BeginTransaction() 
      at NHibernate.Impl.SessionImpl.BeginTransaction() 
      at MetraTech.BusinessEntity.DataAccess.Persistence.StandardRepository.SaveInstances(List`1& dataObjects) in S:\MetraTech\BusinessEntity\DataAccess\Persistence\StandardRepository.cs:line 3103 

     Inner error message was: Connection is already part of a local or a distributed transaction 
     Inner exception at: at Oracle.DataAccess.Client.OracleConnection.BeginTransaction(IsolationLevel isolationLevel) 
      at Oracle.DataAccess.Client.OracleConnection.BeginDbTransaction(IsolationLevel isolationLevel) 
      at System.Data.Common.DbConnection.System.Data.IDbConnection.BeginTransaction() 
      at NHibernate.Transaction.AdoTransaction.Begin(IsolationLevel isolationLevel) 

उत्तर

0

एक सवाल, क्यों तुम भीतरी session.BeginTransaction कर रहे हैं - 2.1 के बाद से जीए NHibernate हो जाता है ताकि वहाँ अब अपनी खुद की ऐसा करने के लिए कोई कारण नहीं है TransactionScope संदर्भों में नामांकन होगा।

+3

यह NHibernate autoflush प्राप्त करने के लिए हो सकता है ठीक से काम करने के लिए – Konstantin

7

केवल लेन-देन गुंजाइश का उपयोग कर के साथ समस्या यह यहां उल्लिखित है: NHibernate FlushMode Auto Not Flushing Before Find

ऐसा प्रतीत होता है nhibernate (ओरेकल बोली और 11g w/opd.net v2.112.1.2 db के साथ v3.1) की आवश्यकता है यह खुद लेनदेन है फ्लशिंग मुद्दे से बचने के लिए, लेकिन मैं निषेध लेनदेन के साथ काम करने के लिए लेनदेन के दायरे को प्राप्त करने में सक्षम नहीं हूं।

मैं यह काम करने के लिए :( इस nhibernate या odp.net, नहीं यकीन है कि में एक दोष हो सकता है पाने के लिए प्रतीत नहीं कर सकते हैं ...

यहाँ एक ही समस्या पाया: NHibernate 3.0: TransactionScope and Auto-Flushing

FIXED : मेरे ऑरैकल कनेक्शन स्ट्रिंग में "enlist = dynamic;" डालने से समाधान मिला! समस्या हल हो गई। मैं निबर्ननेट लेनदेन (फ्लश समस्या को ठीक करने के लिए) और लेनदेन के दायरे दोनों का उपयोग करने में सक्षम हूं:

 ISessionFactory sessionFactory = CreateSessionFactory(); 

     using (TransactionScope ts = new TransactionScope()) 
     { 
      using (ISession session = sessionFactory.OpenSession()) 
      using (ITransaction tx = session.BeginTransaction()) 
      { 
       //do stuff here 

       tx.Commit(); 

      } 
      ts.Complete(); 
     } 

मैं अपने लॉग फ़ाइलों की जाँच की और यह पाया: 2011-06-27 14: 03: 59,852 [10] डीबग NHibernate.Impl.AbstractSessionImpl - डीटीसी लेनदेन में भर्ती हुए: Serializable

से पहले किसी भी SQL कनेक्शन पर मार डाला गया था। उचित निष्पादन की पुष्टि करने के लिए मैं इकाई परीक्षण करूंगा। मुझे यह भी यकीन नहीं है कि सीरियलजेबल मुझे क्या बता रहा है हालांकि

2

ब्रांड्स का जवाब बाहरी लेनदेनस्कोप और एनलिस्ट = गतिशील के साथ एक आंतरिक एनएचबेर्नेट लेनदेन का उपयोग करके, ठीक से काम नहीं करता है। ठीक है, डेटा प्रतिबद्ध हो जाता है।

लेकिन यदि आप दायरे को छोड़ देते हैं। पूर्ण() या tx.Commit() के बाद अपवाद बढ़ाएं डेटा अभी भी प्रतिबद्ध हो गया है (ओरेकल के लिए)! हालांकि, किसी कारण से यह SQL-Server के लिए काम करता है।

एनएचबेर्नेट लेनदेन ऑटो फ्लश का ख्याल रखता है लेकिन अंत में वे अंतर्निहित एडीओ.NET लेनदेन को कॉल करते हैं। जबकि कई स्रोत एनएचबीर्नेट के लिए auto-flush issue को हल करने के लिए उपरोक्त पैटर्न को सर्वोत्तम अभ्यास के रूप में प्रोत्साहित करते हैं, मूल एडीओ.NET पर चर्चा करने वाले सूत्रों का कहना है कि इसके विपरीत: ट्रांज़ेक्शनस्कोप और आंतरिक लेन-देन का उपयोग न करें, न कि ओरेकल के लिए, न कि एसक्यूएल-सर्वर के लिए। (this question और my answer देखें)

मेरा निष्कर्ष: TransactionScope और NHibernate लेनदेन गठबंधन न करें। ट्रांज़ेक्शनस्कोप का उपयोग करने के लिए, एनएचबीरनेट लेनदेन को छोड़ें और फ्लशिंग को मैन्युअल रूप से संभालें (NHibernate Flush doc भी देखें)।

0

NHibernate रसोई की किताब से

याद रखें कि NHibernate जब डेटाबेस के साथ बातचीत के एक NHibernate लेन-देन की आवश्यकता है। TransactionScope एक विकल्प नहीं है। जैसा कि अगली छवि में दिखाया गया है, लेनदेनस्कोप सत्र और एनएचबीरनेट लेनदेन दोनों को पूरी तरह से घेरे रखना चाहिए। सत्र के निपटारे के बाद TransactionScope.Complete() को कॉल करना चाहिए। कोई अन्य आदेश सबसे अधिक संभावना है, कनेक्शन लीक जैसे उत्पादन क्रैशिंग बग।

मेरी राय यह भी है कि इसे लेनदेनस्कोप के साथ काम करना चाहिए, लेकिन यह 3.3.0x00 संस्करण में न तो 3.3.x.x में है।

नुस्खा ऊपर काम कर सकते हैं, लेकिन (जब एसक्यूएल का प्रयोग करके), नेस्टेड TrancactionScope साथ यह परीक्षण करने के लिए आंतरिक TransactionScope एक Transaction.Suppress परिभाषित किया है कि के साथ की जरूरत है, आदि ...

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