Repository.SaveOrUpdate(),在异常时执行回滚的确定性?

时间:2011-12-09 05:29:52

标签: c# .net fluent-nhibernate repository rollback

为了保存(虚拟)银行账户交易清单,我希望业务实体能够反映保存到数据库的状态,以防万一。

我可以假设这里的异常也意味着事务被回滚了吗?或者我可以明确回滚捕获吗?如果是这样,如果该行引发异常怎么办?

在存储库中< 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);
}

3 个答案:

答案 0 :(得分:0)

您必须包含rollback()调用才能正确回滚事务。

答案 1 :(得分:0)

您不能假设事务已回滚,但您不必假设:ITransaction具有bool WasCommitted属性。

您可以检查以确定交易是否已提交,并在有保证的情况下明确致电Rollback()

答案 2 :(得分:0)

处置未提交的事务将始终回滚它 在所有ado.net事务实现中都是如此,当然在运行时NHibernate将使用您选择的ado.net提供程序。