Oracle 11g的NHibernate TransactionScope问题

Sud*_*dip 5 oracle nhibernate transactionscope

以下代码片段适用于SQL Server 2008(SP1),但对于Oracle 11g,对session.BeginTransaction()的调用会抛出异常,并显示消息"Connection已经是本地或分布式事务的一部分"(下面显示的堆栈跟踪) .使用'"NHibernate.Driver.OracleDataClientDriver".

有没有其他人遇到这个?

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();
}
Run Code Online (Sandbox Code Playgroud)
     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)

Bra*_*rad 7

此处概述了仅使用事务范围的问题: NHibernate FlushMode在查找之前自动不刷新

它看起来像nhibernate(v3.1与oracle方言和11g db w/opd.net v2.112.1.2)需要它自己的事务来避免刷新问题,但我无法让事务范围与nhibernate一起工作交易.

我似乎无法让它工作:(这可能是nhibernate或odp.net的缺陷,不确定...

在这里发现了同样的问题: NHibernate 3.0:TransactionScope和Auto-Flushing

固定:找到了解决方案!通过输入"enlist = dynamic;" 进入我的oracle连接字符串,问题得到了解决.我已经能够使用nhibernate事务(修复flush问题)和事务范围,如下所示:

        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();
        }
Run Code Online (Sandbox Code Playgroud)

我检查了我的日志文件并发现了这个:2011-06-27 14:03:59,852 [10] DEBUG NHibernate.Impl.AbstractSessionImpl - 登入DTC事务:Serializable

在连接上执行任何SQL之前.我将进行单元测试以确认正确执行.我不太确定序列化可以告诉我什么


Pau*_*her 0

有一个问题,你为什么要做内部 session.BeginTransaction - 因为 2.1 GA NHibernate 会自动注册到 TransactionScope 上下文中,所以没有理由再做你自己的事情了。