使用NHibernate和事务,我是在提交失败时回滚,还是在单次提交时自动回滚?

使用NHibernate和事务,我是在提交失败时回滚,还是在单次提交时自动回滚?,nhibernate,transactions,Nhibernate,Transactions,我为我的工作单元构建了以下Dispose方法,它基本上包装了活动的NH会话和事务(事务在打开会话后设置为变量,如果NH会话在出错后获得新事务,则不会被替换) public void Dispose() { Func transactionStateOkayFunc= trans=>trans!=null&&trans.IsActive&&trans.wasrollledback; 试一试{ if(transactionStateOkayFunc(this.transaction)) { 如果(已

我为我的工作单元构建了以下Dispose方法,它基本上包装了活动的NH会话和事务(事务在打开会话后设置为变量,如果NH会话在出错后获得新事务,则不会被替换)

public void Dispose()
{
Func transactionStateOkayFunc=
trans=>trans!=null&&trans.IsActive&&trans.wasrollledback;
试一试{
if(transactionStateOkayFunc(this.transaction))
{
如果(已出错)
{
transaction.Rollback();
}
其他的
{
尝试
{
Commit();
}捕获(例外)
{
if(transactionStateOkayFunc(transaction))transaction.Rollback();
投掷;
}
}
}
}最后
{
if(transaction!=null)transaction.Dispose();
if(session.IsOpen)session.Close();
}
我不禁觉得代码有点臃肿,如果非嵌套事务中的离散提交失败,事务会自动回滚吗

提交或回滚是否会自动关闭事务?如果不是,会话.Close()将自动处理关联的事务?

dispose(),如果可用,应始终调用

对于NHibernate的事务,Dispose()将触发回滚,除非已调用Commit()。如果Commit()出错,则不需要调用rollback()。尽管如此,您仍然应该调用Dispose(),如果只是为了遵循该模式

对于会话,询问“Close()调用Dispose()?”有点倒退。我“怀疑”它们可能是等价的,但始终调用其Dispose()是一种好形式。这样做时,不需要单独调用Close()

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