2017-05-30 125 views
0

我有以下代碼:當提交失敗時,Nhibernate是否會回滾事務?

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

    // add some entities there..... 

    Session.Transaction.Commit(); 
} 

如果Commt()失敗,將回滾NHibernate的變化?

+1

請仔細閱讀上面的鏈接,確保您正確地處理交易,如果可能,請使用「使用」聲明。 –

回答

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處理異常。

+0

我明白了。因此,如果在提交失敗時嘗試在catch塊中手動回滾,也存在問題。它在CheckNotZombied()檢查時失敗。 – Alexander