我们在数据更改方法上有拦截器,这些方法在方法运行后将更改刷新到数据库。如果出现死锁,我们希望重新运行这些方法。
在这个简化的示例中,我捕获SqlExceptions,如果出现死锁,我将再次调用Proceed()。
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?
发布于 2015-01-22 14:05:26
如果没有丑恶的黑客攻击重置拦截器链的拦截器计数是不可能的,但是如果确实需要,则必须:
currentInterceptorIndex (文章发布后更改名称)更改为-1。本文作者使用了一种扩展方法。这确实是不推荐的,实际上是;您至少应该为该方法的调用循环设置某种上限,以避免您的DB调用永远不会脱离进行重置-继续流的情况。
https://stackoverflow.com/questions/28090251
复制相似问题