无法使用 NHibernate 加入分布式事务

2024-01-11

我在单元测试中发现一个问题,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();
        }
    }
}

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

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

显然,这看起来像是一件繁重的事情,但产品代码的情况更复杂(外部事务循环和内部事务循环非常分开)。

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

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


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

  • 您在两个环境中使用相同的数据库服务器吗(我假设没有)?
  • 您使用哪个版本的数据库(我使用 10g)?

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

  • Check 调整 Microsoft 事务服务器性能 http://download.oracle.com/docs/cd/B19306_01/win.102/b14320/perftune.htm。默认值ORAMTS_NET_CACHE_MAXFREE参数设置为5,即may与你的问题有关。不过,在采取任何行动之前请阅读整个页面(您可以尝试增加SESSIONS and PROCESSES参数也)。
  • 你可以在 Oracle MTS 上启用跟踪 http://download.oracle.com/docs/cd/B19306_01/win.102/b14320/trouble.htm#sthref461看看那里到底发生了什么。
  • 如果仍然卡住,我想你可以在 MSDTC 上启用跟踪 http://blogs.msdn.com/distributedservices/archive/2009/02/07/the-hidden-tool-msdtc-transaction-tracing.aspx尝试获得更多见解。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

无法使用 NHibernate 加入分布式事务 的相关文章

随机推荐