[英]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。
...请注意,如果没有匹配的数据库行,
Load()
将引发不可恢复的异常 。
但主要是:
摘录:
如果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.