我在单元测试中发现一个问题,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(使用前将#替换为@)