ASP.NET Web 应用程序死锁 - 认为这是由 SQL Server 锁定引起的

标签 asp.net sql-server crash deadlock

我们客户的网络应用程序以随机​​间隔突然重新启动。对于每次重新启动,我们都会在 Windows 事件日志中找到如下条目:

Event Type: Warning
Event Source: W3SVC-WP
Event Category: None
Event ID: 2262
Date: 2/21/2010
Time: 1:33:52 PM
User: N/A
Computer: LIQUID-NXCFZ9DJ
Description:
ISAPI 'c:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\aspnet_isapi.dll' reported itself as unhealthy for the following reason: 'Deadlock detected'.

这种情况在 3 周内发生了 10 次,其中有几次在几个小时内发生了 2 到 3 次,还有一周多没有发生的情况。

在故障转储中,我们可能有 70-80 个客户端连接,如下所示:

GET request for   <path here>
Mapped To URL    <mapped path>
HTTP Version    HTTP/1.1
SSL Request    False
Time alive    00:55:24
QueryString    <query string here>
Request mapped to    
HTTP Request State    HTR_READING_CLIENT_REQUEST
Native Request State    NREQ_STATE_PROCESS

(这是 55 分钟!!!客户端连接没有理由要那么长)

machine.config 中的相关条目:

<system.net>
<connectionManagement>
<add address="*" maxconnection="200" />
</connectionManagement>
</system.net>

和(内部):

<deployment retail="true" />
<!--<customErrors mode="Off"/>-->

<processModel autoConfig="true"
memoryLimit="60"
maxIoThreads="200"
minIoThreads="30"
minWorkerThreads="40"
maxWorkerThreads="200"
clientConnectedCheck="00:00:05" />
<httpRuntime
minFreeThreads="20"
minLocalRequestFreeThreads="10"
enableKernelOutputCache="false"
maxRequestLength="10240" />

最近一次,我们能够在事件发生时查看它,并看到 Sql Server 中大约 20 个查询全部处于“暂停”状态。看起来它们可能都与一张表相关(Items 表,是许多不同操作的非常核心的表)。

我们不确定在问题中最好的做法是什么。当崩溃发生时,Sql Server 被清除。

任何关于正在发生的事情或如何找出正在发生的事情的指导,我们将不胜感激。

最佳答案

如果是死锁,则意味着死锁的循环在 SQL 之外完成。这意味着您试图在持有 SQL 资源(即事务)的同时获取进程资源(即 C#“锁”)。举例说明这种情况是如何发生的,请考虑以下场景:

  1. T1 启动 SQL 事务并用 SQL 更新表 A
  2. T2 在 C# 中锁定一个对象
  3. T1 尝试在 C# 中锁定同一个对象,但阻塞了 T2 的锁
  4. T2 从 SQL 表 A 读取数据,阻止 T1 的更新
  5. T1 在进程内等待 T2,T2 在 SQL 内等待 T1,无法检测到的死锁

这样的情况无法在 SQL 的死锁监控内部检测到,因为死锁循环是在 SQL 外部完成的。您如何诊断这样的问题?对于循环的 SQL Server 端,您可以使用许多强大的工具,主要是 sys.dm_exec_requests它可以告诉您哪些请求被什么阻止。但不幸的是,在循环的应用程序大小方面,没有开箱即用的工具,因此您只能靠自己了。经验丰富的眼睛可以通过代码检查发现问题(在持有 C# 锁的同时执行 SQL 调用或在 SQL 事务中间获取 C# 锁是一个很大的缺陷),否则您必须运用一些技巧 WinDbg -fu,或检测代码。

您还应该考虑到这根本不是僵局。您的 20 个 SQL 请求可能会因应用程序中的普通代码缺陷而被阻止,例如某些请求上的事务泄漏(即,请求等待阻止它们提交的事务,但该事务已在代码中泄漏,并且永远不会被阻止)。关闭)。再说一次,sys.dm_exec_requests 是你的 friend 。

关于ASP.NET Web 应用程序死锁 - 认为这是由 SQL Server 锁定引起的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2390934/

相关文章:

asp.net - SignalR 连接使用 ARR 扭曲 IIS 中的响应时间

javascript - Angular.js 的 ASP.NET 捆绑和缩小错误

javascript - 使用javascript设置cookie并在服务器端读取它

c# - 如何让这个系统设计和逻辑更有效率? (内部消息系统)

sql-server - 根据状态从表中获取最大和最小日期的查询速度较慢

sql - '-' 附近的语法不正确,使用来自 LoginUserRolePermission.zip 的脚本

android - Google Play 开发者控制台中没有崩溃报告?

sql - 删除递归 CTE 中包含 ID 的所有较短子序列

c# - 在 Windows 移动设备上调试时,如何阻止 Visual C# 2005 崩溃?

python - 从回调发出信号时,Python应用程序崩溃