0

我正在使用NHibernate 3.我的应用程序在SQL Server 2008上运行时工作正常,但在SQL 2000上有间歇性错误(我们已经适当地更改了NH方言)。这些错误都与MDTC(分布式事务)组件有关。通常读取工作正常,但代码在保存/更新期间爆炸,但不总是出现相同的错误。我们经常见到的是'分布式事务完成。要么将这个会话加入到新的事务中,要么加入NULL事务。'。为什么NHibernate IPreUpdateEventListener/IPreInsertEventListener中没有活动事务?

我正在调查此问题的根本原因并添加了一些日志记录。我定义了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服务器是服务器2003

回答

3

的TransactionScope不创建NHibernate的交易。

您必须使用session.BeginTransaction()明确地创建它。它将自动列入分布式交易(不要忘记Commit()之前完成)

+1

谢谢。那是我累了,没有看到。我切换到使用NH事务,并且我们有一个类似但相关的错误,事件监听器中的Transaction.Active仍然是错误的,即使我们已经完成了session.BeginTransaction()。这只发生在应用程序与Sql Server不同的机器上时,所以我假定它是网络/权限相关的。 – 2011-01-17 18:28:02

相关问题