我正在使用 NHibernate 3。我的应用程序在 SQL Server 2008 上运行时运行良好,但在 SQL 2000 上出现间歇性错误(我们已经适当地更改了 NH 方言)。这些错误都与 MDTC(分布式事务)组件有关。通常读取工作正常,但代码在保存/更新期间爆炸,但并不总是出现相同的错误。我们经常看到的一个是,'分布式事务已完成。在新事务或 NULL 事务中登记此会话。'。
我正在调查此问题的根本原因并添加了一些日志记录。我定义了 IPreUpdateEventListener 和 IPreInsertEventListener 拦截器,所以我登录那里以及我的存储库。我发现当我到达我的听众时,当前会话中没有事务。
这是我的存储库代码:
public virtual void Save(object entity)
{
logger.DebugFormat("Opening transaction to save entity type {0}.", entity.GetType().Name);
using (var t = new TransactionScope())
{
GetSession().SaveOrUpdate(entity);
logger.DebugFormat("Committing transaction.");
t.Complete();
}
}
这是我的事件监听器代码:
logger.DebugFormat("Save/Insert entity. Transaction.Active = {0}",
persister.Factory.GetCurrentSession().Transaction != null
? persister.Factory.GetCurrentSession().Transaction.IsActive.ToString()
: "no transaction");
这是日志输出:
2011-01-14 17:23:13,549 [9] DEBUG BaseRepository`1.Save - Opening transaction to save entity type XXXXXXX.
2011-01-14 17:23:13,566 [9] DEBUG BaseRepository`1.Save - Committing transaction.
2011-01-14 17:23:13,598 [9] DEBUG AuditEventListener.Audit - Save/Insert entity. Transaction.Active = False
你能看出这有什么问题吗?为什么预插入中没有交易活动?有谁知道我需要为 Sql Server 2000 做些什么特别的事情(MSDTC 已打开)?
注意2008环境是我的本地机器运行Windows 7,Sql Server 2000服务器是Server 2003。