1

全部,

这是使用 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
}

我的问题是:

当您启动事务时,它会在连接上启动数据库事务,但我没有看到相应的提交语句,而是 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() 时刷新会话的代码。

4

1 回答 1

2

那里的想法是您应该将CommitTransaction自己称为using块的一部分,因为当垃圾收集器到达Dispose对象时,可能会出现事务本身引发错误的情况,在这种情况下,您不希望Dispose提交它,你只想处理它。

于 2013-03-14T17:46:15.800 回答