我有以下代码:
public void UpdateEntities()
{
Session.BeginTransaction();
// add some entities there.....
Session.Transaction.Commit();
}
如果Commt()失败,Nhibernate会回滚更改吗?
答案 0 :(得分:0)
如果您查看AdoTransaction
(ref)中的以下代码,您将看到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处理异常。