NHibernate无法在分布式事务中注册

3
我在一个单元测试中遇到了问题,Oracle抛出异常并显示消息“无法在分布式事务中注册”。我们使用ODP.net和NHibernate。在嵌套事务中向数据库提交一定数量的提交后,就会出现此问题。令人恼火的是,这个问题发生在持续集成服务器(Windows Server 2003 R2 SP1)上,而不是我的开发机器(XP SP2)。
以下是该问题的简要复现:
using (new TransactionScope())
{
    for (int j = 0; j < 15; j++)
    {
        using (var transactionScope = new TransactionScope(TransactionScopeOption.Required))
        using (var session = sessionFactory.OpenSession())
        {
            for (int i = 0; i < 200; i++)
            {
                var obj = [create new NHibernate mapped obj]
                session.Save(obj);
            }
            session.Flush();
            transactionScope.Complete();
        }
    }
}

我们使用的连接字符串是:

Data Source=server;User Id=user;Password=password;Enlist=true;

显然,这看起来有点笨重,但产品代码的情况更为复杂(外部事务循环和内部事务循环非常分离)。
在构建服务器上,它可靠地在第五次迭代外部循环(j)时中断。既然它在我的本地机器上通过了,我想知道这是否达到了某种已配置的事务或连接限制?
任何人有什么猜测可以尝试吗?显然解决此问题的明显方法是更改代码以更好地处理此情况,但我只想了解为什么它在一台机器上工作而在另一台机器上不工作。谢谢!

你在使用哪个版本的 NHibernate? - Stefan Steinegger
而且,你是否收到了Oracle的错误编号? - DCookie
NHibernate版本为2.0.1.4000,Oracle服务器版本为10g 10.2.0.3.0。我尝试从异常中找出Oracle错误编号,但它与错误编号列表不匹配。错误编号显示为-1050。看到那里有一个负数,我感到怀疑... - Niall Connaughton
1个回答

3
我觉得这与你的Oracle数据库配置有关。
  • 你在两个环境中使用相同的数据库服务器吗(我认为不是)?
  • 你使用哪个版本的数据库(我会选择10g)?
基于这些假设,以下是我找到的内容:

版本号在上面的注释中。当我在开发机上运行测试时,我连接到同一台数据库服务器,而在构建机上运行时也是如此。maxfree参数在我的开发环境和构建机器上是相同的,所以我不认为它引起了这个问题。谢谢提供链接,我打算尝试启用Oracle MTS跟踪。 - Niall Connaughton
在跟踪中出现的错误为:enlistInMSDTCTxn() - 出现0x8004d00e注册错误。我正在深入了解此错误编号,可能也会查看MSDTC跟踪。 - Niall Connaughton

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接