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

6 nhibernate transactions

我已经为我的工作单元构建了以下Dispose方法,它基本上包装了活动的NH会话和事务(在打开会话后事务集设置为变量,如果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();
        }
Run Code Online (Sandbox Code Playgroud)

我不禁觉得代码有点臃肿,在非嵌套事务的情况下,事务会自动回滚是一个离散的Commit失败吗?

提交或回滚会自动进行交易吗?如果没有,Session.Close()会自动处理关联的事务吗?

Osk*_*ren 5

如果可用,则应始终调用 Dispose()。

对于 NHibernate 的事务,除非 Commit() 已经被调用,否则 Dispose() 将触发回滚。如果 Commit() 出错,您不需要调用 Rollback()。虽然恕我直言,你仍然应该调用 Dispose(),如果只是为了遵循模式。

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