saveorupdate(),在异常时执行回滚的确定性
本文关键字:执行 确定性 异常 saveorupdate | 更新日期: 2023-09-27 18:17:10
对于保存(虚拟)银行账户事务列表,我希望业务实体反映保存到数据库的状态,也以防出现异常。
我是否可以假设这里的异常也意味着事务回滚?或者我可以在catch中显式回滚以确定吗?如果是,如果该行抛出异常怎么办?
在Repository<;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);
}
您不能假设事务已回滚,但您不必假设:ITransaction
具有bool WasCommitted
属性。
Rollback()
。必须包含rollback()调用才能正确回滚事务。
处置未提交的事务将始终回滚它。
这在所有ado.net事务实现中都是正确的,当然在运行时NHibernate将使用你选择的ado.net提供程序。