首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >城堡温莎-拦截器:呼叫invocation.Proceed两次

城堡温莎-拦截器:呼叫invocation.Proceed两次
EN

Stack Overflow用户
提问于 2015-01-22 13:42:48
回答 1查看 1.1K关注 0票数 1

我们在数据更改方法上有拦截器,这些方法在方法运行后将更改刷新到数据库。如果出现死锁,我们希望重新运行这些方法。

在这个简化的示例中,我捕获SqlExceptions,如果出现死锁,我将再次调用Proceed()

代码语言:javascript
复制
try {
  invocation.Proceed();
  if (!isReadOnly) {
    log.Trace("Flushing the unit of work.");
    session.Flush();
  }
} catch (GenericADOException ex) {
  var sqle = ADOExceptionHelper.ExtractDbException(ex) as SqlException;
  if (sqle != null) {
  if (sqle.Number == deadlockVictim) {
    invocation.Proceed();
  }
}

由于卡塞尔注意到我试图第二次调用Proceed()并抛出一个以以下开头的异常,这导致了失败:

这是一个DynamicProxy2错误: invocation.Proceed()被调用的次数比预期的多。

如何在捕获异常后再次调用Proceed

EN

回答 1

Stack Overflow用户

发布于 2015-01-22 14:05:26

如果没有丑恶的黑客攻击重置拦截器链的拦截器计数是不可能的,但是如果确实需要,则必须:

  • 进入IInterception类并以任意方式将currentInterceptorIndex (文章发布后更改名称)更改为-1。本文作者使用了一种扩展方法。
  • 在解决了DB中的任何问题后,再次调用DB方法

这确实是不推荐的,实际上是;您至少应该为该方法的调用循环设置某种上限,以避免您的DB调用永远不会脱离进行重置-继续流的情况。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28090251

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档