2011-12-09 65 views
1

爲了保存(虛擬)銀行賬戶交易清單,我希望業務實體能夠反映保存到數據庫的狀態,以防發生異常。Repository.SaveOrUpdate(),在異常時執行回滾的確定性?

我可以認爲這裏的異常還意味着事務回滾了嗎?或者我可以明確地回滾一下,以確保?如果是這樣,那麼該行會拋出異常呢?

在庫< T>:

public void SaveOrUpdate(IList<T> entityList) 
{ 
    using (ISession session = FluentNHibernateManager.OpenSession()) 
    { 
     using (ITransaction transaction = session.BeginTransaction()) 
     { 
      try 
      { 
       foreach (T entity in entityList) 
        session.SaveOrUpdate(entity); 
       transaction.Commit(); 
      } 
      catch (Exception e) 
      { 
       MyTrace.Exception(e.ToString()); 
       // add this line? transaction.Rollback(); 
       throw; 
      } 
     } 
    } 
} 

在某些類別:

cashTransactions.Add(t); 
try { 
    GenericRepository<CashTransaction> repo = new GenericRepository<CashTransaction>(); 
    repo.SaveOrUpdate(cashTransactions); 
} catch (Exception ex) { 
    cashTransactions.Remove(t); 
} 

回答

0

您不能假定交易已回滾,但您不必假設:ITransaction具有bool WasCommitted屬性。

您可以檢查以確定事務是否已提交,並在需要時明確呼叫Rollback()

0

你得包括回滾()調用正確回滾事務。

0

要處置未提交的事務將始終回滾它。
在所有ado.net事務實現中都是如此,當然在運行時NHibernate將使用您選擇的ado.net提供程序。