编程语言
首页 > 编程语言> > c#-无法通过NHibernate参与分布式事务

c#-无法通过NHibernate参与分布式事务

作者:互联网

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

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

解决方法:

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

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

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

>检查Tuning Microsoft Transaction Server Performance.ORAMTS_NET_CACHE_MAXFREE参数的默认值设置为5,这可能与您的问题有关.但是,在执行任何操作之前,请阅读整个页面(您也可以尝试增加SESSIONS和PROCESSES参数).
>您可以enable tracing on Oracle MTS查看那里实际发生的情况.
>如果仍然存在,我想您可以enable tracing on MSDTC尝试获得更多洞察.

标签:oracle,transactions,nhibernate,c
来源: https://codeday.me/bug/20191210/2102818.html