无法使用NHibernate登记分布式事务
我在unit testing中看到一个问题,其中Oracle被抛出exception,消息“无法在分布式事务中登记”。 我们正在使用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 =用户;密码=密码; Enlist = true;
显然,这看起来像是一件沉重的事情,但产品代码的情况更复杂(外部事务循环和内部事务循环非常分离)。
在构建服务器上,它可靠地在外部循环(j)的第五次迭代中轰炸。 看到它在我的本地机器上传递,我想知道这是否达到某种配置的事务或连接限制?
任何人都可以尝试任何预感吗? 修复它的显而易见的方法是更改代码以更好地处理这种情况,但我只想了解它为什么在一台机器上工作而不在另一台机器上工作。 谢谢!
在我看来,这与您的Oracle数据库配置有关。
- 您是否在两种环境中使用相同的数据库服务器(我假设不是)?
- 你使用的是哪个版本的数据库(我需要10g)?
以下是我根据这些假设找到的内容:
- 检查调整Microsoft Transaction Server性能 。
ORAMTS_NET_CACHE_MAXFREE
参数的默认值设置为5,这可能与您的问题有关。 但是,在采取任何操作之前,请阅读整个页面(您也可以尝试增加SESSIONS
和PROCESSES
参数)。 - 您可以在Oracle MTS上启用跟踪,以查看那里发生的事情。
- 如果仍然卡住,我想你可以在MSDTC上启用跟踪以尝试获得更多洞察力。