无法使用NHibernate登记分布式事务

时间:2009-06-18 11:24:45

标签: c# oracle nhibernate transactions

我在单元测试中看到一个问题,其中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)的第五次迭代中爆炸。看到它在我的本地机器上传递,我想知道这是否达到某种配置的事务或连接限制?

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

1 个答案:

答案 0 :(得分:3)

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

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

以下是我根据这些假设找到的内容: