2011-12-09 6 views
1

(仮想)銀行口座取引の一覧を保存するために、ビジネスエンティティに、例外の場合でもデータベースに保存された状態を反映させたいと思います。Repository.SaveOrUpdate()、例外で実行されるロールバックの確実性?

ここでの例外は、トランザクションがロールバックされていることも意味しますか?または、明示的にキャッチをロールバックすることはできますか?もしそうなら、その行が例外をスローすればどうなるでしょうか?いくつかのクラスで

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; 
      } 
     } 
    } 
} 

:リポジトリ< T>では

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は選択したADNプロバイダを使用します。

関連する問題