繁体   English   中英

提交失败时,何时需要回滚NHibernate事务?

[英]When would I need to rollback an NHibernate transaction when it fails on commit?

我正在按照这个示例说明如何在NHibernate中实现每个请求会话的事务。

我有以下几点:

public class SessionManagementAttribute : ActionFilterAttribute
{
    private ISessionFactory SessionFactory { get; set; }

    public SessionManagementAttribute()
    {
        SessionFactory = WebApiApplication.SessionFactory;
    }

    public override void OnActionExecuting(ActionExecutingContext actionContext)
    {
        var session = SessionFactory.OpenSession();
        CurrentSessionContext.Bind(session);
        session.BeginTransaction();
    }

    public override void OnActionExecuted(ActionExecutedContext actionExecutedContext)
    {
        var session = SessionFactory.GetCurrentSession();
        var transaction = session.Transaction;
        if (transaction != null && transaction.IsActive)
        {
            //  TODO: Do I need to rollback a transaction here?
            transaction.Commit();
        }
        session = CurrentSessionContext.Unbind(SessionFactory);
        session.Close();
    }
}

我想知道-如果我的事务提交失败并且抛出NHibernate异常-我是否应该捕获并回滚事务? 在我当前的代码中,我有一个明确的捕获和回滚。 例如,

public void Save(Video video)
{
    try
    {
        NHibernateSessionManager.Instance.BeginTransaction();
        DoSave(video);
        NHibernateSessionManager.Instance.CommitTransaction();
    }
    catch (Exception exception)
    {
        Logger.Error(exception);
        NHibernateSessionManager.Instance.RollbackTransaction();
        throw;
    }
}

但我从阅读中看到的暗示可能没有必要。 谁能澄清?

我们总是必须处理会议。 如果一切正常,即使出现问题也可以。 看一下这些: 6.5。 延迟初始化 (引用)

在基于Web的应用程序中,一旦视图的渲染完成,则只能在用户请求的最后使用事件处理程序来close() ISession 当然,这对应用程序基础结构的异常处理的正确性提出了很高的要求 至关重要的是 ,即使在呈现视图期间发生异常 ,也要在返回用户之前closed ISession并结束transaction 对于这种方法,事件处理程序必须能够访问ISession。

另一个地方: 9.2。 加载对象 (引用)

...请注意,如果没有匹配的数据库行, Load()将引发不可恢复的异常

但主要是:

9.8。 异常处理

摘录:

如果ISession引发异常,则应立即回滚该事务,请调用ISession.Close()并丢弃ISession实例 ISession的某些方法不会使会话保持一致状态...

记录的示例:

ISession sess = factory.openSession();
try
{
    // do some work
    ...
    sess.Flush();
    currentTransaction.Commit();
}
catch (Exception e)
{
    currentTransaction.Rollback();
    throw;
}
finally
{
    sess.Close();
}

摘要

换句话说,会话处理是我们的责任。 我们必须确保将回滚称为“某些外部情况”,这可能会在连接关闭时进行回滚...我们还必须确保会话在结束时正确暴露

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM