nhibernate - 如何在请求中发生异常时回滚 NHibernate 事务以管理会话?

  显示原文与译文双语对照的内容

我将 NHibernate 用于 ORM,Ninject用于 IoC 。 我为每个定制范围( 你可以假设是每个请求) 创建 NHibernate 会话。 我开始事务 onActivation 。 我提交事务 onDeactivation 。

如果在请求中发生异常,那么我希望回滚事务而不是提交它。 了解如何检测异常发生的( 以干净的方式,很可能使用Ninject上下文)?

注意:我不关心在提交时可以能会发生的异常,我可以在以下代码和角色中轻松回复。


protected void BindWithSessionWrapper<T>(Func<IContext, T> creationFunc) where T : ISessionWrapper


{


 Bind<T>().ToMethod(creationFunc)


. InScope(x => new NinjectCustomScope())//work in progress!!!


. OnActivation(t => t.Session.BeginTransaction(IsolationLevel.ReadCommitted))


. OnDeactivation((c, t) => 


 { 


 t.Session.Transaction.Commit();


 t.Session.Dispose();


 });


}



更新:

我按照 @BatteryBackupUnit.的建议 因此,我将以下内容添加到错误 EventHandler:


 Error += (s, e) =>


 {


 HttpContext.Current.Items["ErrorRaised"] = true;


 };



我修改了 OnDeactivation,看起来像这样:


OnDeactivation(t => 


 { 


 if ((bool?)HttpContext.Current.Items["ErrorRaised"] == true)


 t.Session.Transaction.Rollback();


 else


 t.Session.Transaction.Commit();



 t.Session.Dispose();


 });



如果发生异常的话,在上下文中设置一个标志会更好地处理这个问题:

时间: 原作者:

如何实现 IHTTPModule 并订阅 Error 事件? 就像在这里描述一样。

Error 事件处理程序中,使用 System.Web.Mvc.DependencyResolver.Current.GetService(typeof (ISession)) 检索当前会话并回滚事务。

但是,请注意,如果请求没有使用会话,这将创建一个,这是非常多余的。

可以执行检查事务是否已经启动并仅在回滚后的操作。 但你还是会创建一个不必要的会话。

你可以通过使用 Error 事件处理程序在 HttpContext.Current.Items 上设置一个标志来进一步改进,比如


HttpContext.Current.Items["RollbackTransaction"] = true;



然后在会话的OnDeactivation 中使用它,例如:


. OnDeactivation((c, t) => 


 { 


 if(HttpContext.Current.Items.Contains("RollbackTransaction"])


 {


 t.Session.Transaction.Rollback();


 }


 else


 {


 t.Session.Transaction.Commit();


 }


 t.Session.Dispose();


 });



请注意,HttpContext 是线程本地,意味着当 switch 线程可以能是 null 或者-worst时,它甚至还是另一个 HttpContext

请注意,我无法尝试它,所以它可能无法工作。 反馈致谢。

原作者:
...