【问题标题】:Unable to enlist in a distributed transaction with NHibernate无法使用 NHibernate 加入分布式事务
【发布时间】:2010-11-03 23:19:18
【问题描述】:

我在单元测试中看到一个问题,Oracle 抛出异常并显示消息“无法加入分布式事务”。我们正在使用 ODP.net 和 NHibernate。在嵌套事务中对数据库进行一定数量的提交后,就会出现此问题。烦人的是,这在持续集成服务器(Windows Server 2003 R2 SP1)上失败了,而不是在我的开发机器上(XP SP2)。

这是对该问题的一个小(ish)再现:

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();
        }
    }
}

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

数据源=服务器;用户 ID=用户;密码=密码;登记=真;

很明显,这看起来是一件很麻烦的事情,但是产品代码的情况更复杂(外部事务循环和内部事务循环非常分离)。

在构建服务器上,它可靠地在外部循环 (j) 的第五次迭代中被炸毁。看到它在我的本地机器上传递,我想知道这是否达到了某种配置的事务或连接限制?

有人有预感我可以试试吗?解决它的明显方法是更改​​代码以更好地处理这种情况,但我只想了解它为什么在一台机器上工作而不是在另一台机器上工作。谢谢!

【问题讨论】:

  • 您使用的是哪个版本的 NHibernate?
  • 还有,你收到了 oracle 错误号吗?
  • NHibernate 版本是 2.0.1.4000,Oracle 服务器是 10g 版本 10.2.0.3.0。我试图从异常中挖掘出 oracle 错误号,但它与错误号列表不匹配。错误号显示为 -1050。看到那里是负数,我很怀疑......

标签: c# oracle nhibernate transactions


【解决方案1】:

在我看来,这与您的 Oracle 数据库配置有关。

  • 您是否在两种环境中使用相同的数据库服务器(我假设不是)?
  • 您使用哪个版本的数据库(我要 10g)?

根据这些假设,我可以找到以下内容:

【讨论】:

  • 版本号在上面的评论中。在我的开发机器上运行测试和在构建机器上运行时,我连接到同一个数据库服务器。我的开发箱和构建机器之间的 maxfree 参数是相同的,所以我认为它不会导致问题。感谢您提供的链接,我将尝试启用 Oracle MTS 跟踪。
  • 跟踪中出现的错误是:enlistInMSDTCTxn() - error enlisting 0x8004d00e。我正在研究这个错误号,可能还会查看 MSDTC 跟踪。
猜你喜欢
  • 1970-01-01
  • 2015-07-02
  • 2011-11-20
  • 2012-01-24
  • 1970-01-01
  • 1970-01-01
  • 2018-01-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多