【发布时间】:2014-05-19 19:43:14
【问题描述】:
问题是,当 2 个进程相互锁定时,SQL Server 有时会选择一个会话作为其死锁牺牲品。一个进程进行更新,而另一个只是读取。在读取期间,SQL Server 会创建所谓的“共享锁”,它不会阻止其他读取器,但会阻止更新器。到目前为止,解决这个问题的唯一方法是重新处理受害线程。
现在这发生在 Web 应用程序中,我希望有一种机制可以在需要时进行重新处理(比如说最多 5 次)。
我查看了IHttpModule,其中调用了BeginRequest() 和EndRequest() 事件(以及其他事件),但这并不能让我重新处理请求。
事实上,我需要的是在 http 处理程序和被调用的进程之间强制执行的东西。
我可以这样写:
int maxtries = 5;
while(maxtries > 0)
{
try
{
using(var scope = Session.OpenTransaction())
{
// process
scope.Complete(); // commit
return result;
}
}
catch(DeadlockException dlex)
{
maxtries--;
}
catch(Exception ex)
{
throw;
}
}
但我必须为所有乏味且容易出错的请求编写该代码。如果我可以通过自动调用的 Web.Config 配置一种重新处理处理程序并为我执行处理死锁重新处理,那我会很好。
【问题讨论】:
-
您使用什么网络技术? WebForms、MVC、Web API?
-
我知道您想在 C# 中执行此操作,但您可能需要考虑在 SQL 中重新尝试。看看我们在研究死锁问题时发现的这篇文章。 codeproject.com/Articles/42547/…
-
我们使用微软的 MVC4
-
使用 SQL 不是我们的选择。我们使用 ORM (DataObjects.Net) 进行数据访问
-
DataObjects.Net 有一个再处理库,但它或多或少地完成了我在我的小示例代码中编写的内容,但更高级。
标签: c# sql-server http deadlock