当使用 NHibernate 的事务时,尽量避免使用 Session.Flush() 而是使用它在内部调用 session.flush() 的 transaction.Commit()。
如果在 Commit() 期间发生错误并且需要回滚事务,则可以这样解决。
public static void CommitChanges()
{
ITransaction transaction = Session.BeginTransaction();
try
{
transaction.Commit();
}
catch (HibernateException ex)
{
transaction.Rollback();
//close and dispose session here
throw ex;
}
finally
{
transaction.Dispose();
}
}
现在,如果手动调用 flush() 或调用 commit() 成功通过,则无法使用 NHibernate 机制回滚事务。特别是在调用 transaction.Commit() 命令时,NHibernate 创建的 AdoTransaction 会在 Commit() 完成后立即释放,因此您无法访问它以回滚。
上面的代码示例允许您捕获提交期间发生的错误,然后回滚已经开始的事务。
现在,不是在上面的示例中调用 transaction.Commit(),而是在我的测试中调用 session.Flush(),因为从未提交事务,所以没有数据保存在数据库中。
我不知道您的代码是什么样的,但是如果您以模式调用,如上面的代码示例所示,transaction.commit() 而不是 Session.Flush() 它应该为您提供一种实现您所想的方法想。