Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 无法登记到具有NHibernate的分布式事务中_C#_Oracle_Nhibernate_Transactions - Fatal编程技术网

C# 无法登记到具有NHibernate的分布式事务中

C# 无法登记到具有NHibernate的分布式事务中,c#,oracle,nhibernate,transactions,C#,Oracle,Nhibernate,Transactions,我在单元测试中发现了一个问题,Oracle抛出了一个异常,消息是“无法登记到分布式事务中”。我们正在使用ODP.net和NHibernate。在嵌套事务中对数据库进行一定数量的提交后,会出现此问题。令人烦恼的是,这在持续集成服务器(Windows server 2003 R2 SP1)上失败,而在我的开发人员机器(XP SP2)上则没有 这是对该问题的一个小(ish)复制: using (new TransactionScope()) { for (int j = 0; j < 1

我在单元测试中发现了一个问题,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();
        }
    }
}
使用(新TransactionScope())
{
对于(int j=0;j<15;j++)
{
使用(var transactionScope=new transactionScope(TransactionScopeOption.Required))
使用(var session=sessionFactory.OpenSession())
{
对于(int i=0;i<200;i++)
{
var obj=[创建新的NHibernate映射obj]
session.Save(obj);
}
session.Flush();
transactionScope.Complete();
}
}
}
我们正在使用的连接字符串是:

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

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

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


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

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

  • 您是否在两种环境中使用相同的数据库服务器(我假定不是)
  • 您使用哪个版本的数据库(我要10g)
根据这些假设,我可以发现:

  • 检查。
    ORAMTS\u NET\u CACHE\u MAXFREE
    参数的默认值设置为5,这可能与您的问题有关。但是,在采取任何行动之前,请阅读整个页面(您也可以尝试增加
    会话
    进程
    参数)
  • 你可以看看那里到底发生了什么
  • 如果仍然卡住,我想你可以尝试获得更多的洞察力

您使用的是哪个版本的NHibernate?您是否收到oracle错误号?NHibernate版本是2.0.1.4000,oracle server是10g版本10.2.0.3.0。我试图从异常中找出oracle错误号,但它与错误号列表不匹配。错误号为-1050。我怀疑看到一个负数…版本号在上面的评论中。在我的开发机器上运行测试和在构建机器上运行测试时,我连接到同一个数据库服务器。maxfree参数在我的dev-box和构建机器之间是相同的,所以我认为这不是问题的根源。感谢您提供的链接,我将尝试启用Oracle MTS跟踪。跟踪中出现的错误是:登记MSDTCTXN()-错误登记0x8004d00e。我正在挖掘这个错误号,也许还可以看看MSDTC跟踪。