提交失败时Nhibernate是否回滚事务?

时间:2017-05-30 20:43:26

标签: c# .net nhibernate

我有以下代码:

public void UpdateEntities()
{
   Session.BeginTransaction();

   // add some entities there.....

   Session.Transaction.Commit();
}

如果Commt()失败,Nhibernate会回滚更改吗?

1 个答案:

答案 0 :(得分:0)

如果您查看AdoTransactionref)中的以下代码,您将看到NH在尝试提交期间如何对错误做出反应。

if (session.FlushMode != FlushMode.Manual)
{
    session.Flush();
}

NotifyLocalSynchsBeforeTransactionCompletion();
session.BeforeTransactionCompletion(this);

try
{
    trans.Commit();
    log.Debug("DbTransaction Committed");

    committed = true;
    AfterTransactionCompletion(true);
    Dispose();
}
catch (HibernateException e)
{
    log.Error("Commit failed", e);
    AfterTransactionCompletion(false);
    commitFailed = true;
    // Don't wrap HibernateExceptions
    throw;
}
catch (Exception e)
{
    log.Error("Commit failed", e);
    AfterTransactionCompletion(false);
    commitFailed = true;
    throw new TransactionException("Commit failed with SQL exception", e);
}
finally
{
    CloseIfRequired();
}

虽然事务没有明确回滚,但肯定没有提交。因此,我认为您的问题的答案是肯定的,等待数据库更改将被回滚。

值得注意的是,对Flush()的调用并未包含在try中。因此值得注意的是,此处捕获的异常会使Session处于不可预测的状态。因此guidance处理异常。