SQL Server - 可能发生多少种类型的超时,以及如何发生?

dsu*_*sum 12 sql-server deadlock query-timeout

使用 SQL Server 时,可以有多个应用程序主机访问它,每个应用程序可以有一个或多个连接。每个连接都可能有多个事务(如果我错了,请纠正我)。每个事务都可以执行查询或非查询 SQL。

根据我的经验,如果我查询一个被独占锁定的表,我很容易遇到超时。如果两个不同的应用程序锁定同一资源,我还看到 SQL Server 检测并抛出死锁异常而不是超时。我还显示了重建索引超时,这可能是由于有人仍然连接到表。

但是,我也遇到了一种死锁,SQL Server 没有检测到它或超时。在这个应用程序中,它打开了两个连接,两个独立的事务,其中第一个事务锁定了一个资源,第二个事务尝试访问相同的资源,但它没有关闭第一个事务。

有人会提供超时和/或死锁类型的列表,这将帮助我在处理应用程序时避免此类情况。

Aar*_*and 15

从应用的角度来看,有:

  • 连接超时(应用愿意等待多长时间才能建立到 SQL Server 的连接)
  • 命令超时(应用程序愿意等待命令完成的时间,包括从 SQL Server 中提取结果)

回到我经典的 ASP 时代,它们的默认值分别是 15 秒和 30 秒,我不知道今天在 .NET 中它们的默认值是什么。

SQL Server 有自己的超时设置,例如:

  • 远程查询超时。默认值为 600 秒(10 分钟)。
  • 远程登录超时。默认值为 10 秒。
  • 查询等待。默认值为 -1(25 x 查询成本)。
  • 全文协议处理程序超时。默认值为 60 秒。

您可以在此处查看系统的这些值:

SELECT * FROM sys.configurations
WHERE configuration_id IN (1519,1520,1541,1557);
Run Code Online (Sandbox Code Playgroud)

还有@@LOCK_TIMEOUT(默认为 -1(无穷大))。这是 SQL Server 在阻塞资源上等待的时间。您可以使用SET LOCK_TIMEOUT. 更多细节在这里

我想死锁也可能属于这一类。系统每 5 秒扫描一次死锁情况,并且没有神奇的公式来确定与任何涉及的请求何时开始相关的死锁发生时间。这是因为 SQL Server 不会让最早的事务获胜。它根据DEADLOCK_PRIORITY和回滚受害者所需的估计资源量来选择受害者。更多细节在这里

还有一个内存授予超时(可以使用资源调控器自定义)。根据并发性,如果在获取所有请求的内存之前达到超时,查询不一定会失败,它只会以分配的数量运行(因此效率可能较低)。如果失败,您可能会看到消息 8645。

通过查看以下错误消息,您可以了解 SQL Server 中可能发生的其他潜在超时情况:

SELECT message_id, [text]
  FROM sys.messages 
  WHERE language_id = 1033 
  AND ([text] LIKE '%timeout%' OR [text] LIKE '%time out%')
Run Code Online (Sandbox Code Playgroud)

但是,我不认为任何人尝试为您提供每个可能的超时情况的完整和详尽的列表是实用的、可行的或富有成效的。解决您遇到的问题,而不是过早地解决您可能永远不会解决的一大堆问题……