Nhibernate读取/保存会话模式,确切的事务行为是什么?

时间:2013-03-14 16:39:42

标签: c# .net nhibernate ado.net transactions

所有

这是用于使用n-hibernate会话读/写数据的模式:

using(var session = factory.OpenSession())
using(var tx = session.BeginTransaction())
{
    // all the code that uses the session goes here
    // use session to load and/or save entity
}

我的问题是:

当你启动一个事务时,它会在连接上启动数据库事务,但是我没有看到相应的commit语句,而tx上的using语句将调用tx.Dispose()。查看n-hibernate源代码(来自使用SqlTransaction对象的AdoTransaction类),底层事务对象永远不会被提交,而是如下所示进行处置。 那么,我们是否假设SqlTransaction提供程序在处置之前会调用commit?这是针对ado.net的SqlClient提供程序的某处文档吗?

if (isDisposing)
{
    if (trans != null)
    {
        trans.Dispose();
        trans = null;
        log.Debug("IDbTransaction disposed.");
    }

    if (IsActive && session != null)
    {
        // Assume we are rolled back
        AfterTransactionCompletion(false);
    }
}

显然,由于在调用tx.Dispose()时无法找到刷新会话的代码,因此我遗漏了一些内容。

1 个答案:

答案 0 :(得分:2)

这个想法是你应该自己调用CommitTransaction作为using块的一部分,就像当垃圾收集器到达Dispose对象时,可能存在如果事务本身引发了错误,在这种情况下你不希望Dispose提交它,你只想处理它。