SQL Server - 有没有办法强制执行最大锁定保持超时?

时间:2018-03-09 14:53:43

标签: c# sql-server

在我们的申请中似乎有一个非常罕见的以下情况:

  1. 代码执行大量读取,升级为表锁
  2. 执行大量读取的工作人员被杀死很少,并且在持有表锁时最终处于部分/停滞状态
  3. 在停止进程被完全终止之前,SQL服务器不会释放锁定
  4. 目前尚不清楚导致步骤2的原因,并且可能难以修复。

    我找不到的是阻止SQL服务器允许任何进程长时间保持锁定的任何方法。因此,我的问题是,您是否可以在SQL Server上强制执行最大锁定超时?

    这意味着我们可以确保没有锁定持续时间超过15秒 - 如果发生这种情况,我们可以根据具体情况采取行动。

    修改其他信息:

    在正常情况下(使用使用块)清除所有查询。这是一种非常罕见的例子,通常100%工作且有效的代码行被不正常地终止,使得它最终处于持有锁的部分状态。这本身发生在较低级别(Linq to sql / entity framework / connection pooling)。

    因此 - 是的,我们可以通常避免所有表锁,但这很难强制执行。我们可以尝试找到导致停滞过程的错误,但这可能更难。因此,我认为如果有办法强制防止长表锁,这实际上是更可取的。 @Dan Guzman善意地表示他不认为这是可能的。鉴于这是理论上的理想设置,如果您的查询绝对需要运行更长时间,则可以覆盖此设置(@jesús lópez

2 个答案:

答案 0 :(得分:0)

尝试在工作器代码中或通过检查服务器连接属性中的默认值来设置XACT_ABORT ON。它将回滚可能持有锁的事务。根据代码的结构,如果错误处理是复杂的,可能会影响整个过程,所以请注意。

答案 1 :(得分:-1)

如果您可以在阅读操作中容忍脏读,那么使用NOLOCK提示可能值得一看:

https://www.mssqltips.com/sqlservertip/2470/understanding-the-sql-server-nolock-hint/