我已经为我的工作单元构建了以下Dispose方法,它基本上包含了活动的NH会话和& transaction(事务在打开会话后设置为变量,如果NH会话在错误后获得新事务则不被替换)
public void Dispose()
{
Func<ITransaction,bool> transactionStateOkayFunc =
trans => trans != null && trans.IsActive && !trans.WasRolledBack;
try {
if(transactionStateOkayFunc(this.transaction))
{
if (HasErrored)
{
transaction.Rollback();
}
else
{
try
{
transaction.Commit();
} catch (Exception)
{
if(transactionStateOkayFunc(transaction)) transaction.Rollback();
throw;
}
}
}
} finally
{
if(transaction != null) transaction.Dispose();
if(session.IsOpen) session.Close();
}
我不禁觉得代码有点臃肿,在非嵌套事务的情况下,事务会自动回滚是一个离散的Commit失败吗?
提交或回滚会自动进行交易吗?如果没有,Session.Close()会自动处理关联的事务吗?
答案 0 :(得分:3)
应始终调用Dispose()(如果可用)。
对于NHibernate的事务,Dispose()将触发回滚,除非已经调用了Commit()。如果Commit()出错,则无需调用Rollback()。虽然恕我直言,你仍然应该调用Dispose(),如果只是为了遵循模式。
对于会话,询问“执行Close()调用Dispose()?”有点倒退。我“怀疑”它们可能是等价的,但总是调用它的Dispose()是好的形式。这样做时,您不需要单独调用Close()。