为什么NHibernate IPreUpdateEventListener / IPreInsertEventListener中没有活动事务?

时间:2011-01-14 17:54:08

标签: nhibernate sql-server-2008 transactions sql-server-2000 msdtc

我正在使用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。

1 个答案:

答案 0 :(得分:3)

TransactionScope 创建NHibernate事务。

您必须使用session.BeginTransaction()显式创建它。它将自动登记在分布式事务中(在完成之前不要忘记Commit()