【问题标题】:Prevent deadlock in SQL using query wait option使用查询等待选项防止 SQL 死锁
【发布时间】:2018-11-16 05:56:59
【问题描述】:

我们正在使用 Amazon RDS 进行数据库托管。最近我们偶尔会看到死锁。我们尝试使用@@LOCK_TIMEOUT 解决它,但后来发现它仅适用于会话而不是数据库级别。

我找到了这个链接

https://docs.microsoft.com/en-us/previous-versions/sql/sql-server-2012/ms175463(v=sql.110)

这表示您可以在数据库级别设置查询等待并设置到期时间。但是有一段说不推荐

谁能指导我在数据库级别设置锁定超时以避免死锁。如果可以从代码中实现某些东西,那也是可行的。 我们使用实体框架 4

仅供参考:我们检查了分析器,没有查询问题导致死锁可能并发。

【问题讨论】:

  • “我们已经检查了分析器,没有导致死锁的查询问题” - 好吧,显然这是不正确的!
  • @MitchWheat 我对数据库的了解有限,所以如果我所做的不正确,我深表歉意。我正在关注互联网上的几篇文章。我们在一页上遇到了大多数死锁。我试图弄清楚该页面上是否有任何更新/插入,因为从 UI 来看它只是一个搜索页面(所以我的假设是只看到选择语句)。在分析器中,我看到了很少的更新查询 - 所以我删除了它们,因为我认为现在这个页面上的所有线程只会执行 select 语句,由于共享锁,这会很好,但是,我们仍然看到死锁,我不知道为什么。

标签: sql-server database database-deadlocks


【解决方案1】:

@@LOCK_TIMEOUT 与死锁无关,defines only the maximal time 将在 Microsoft SQL Server 尝试锁定某些资源并返回锁定错误之前通过。 死锁情况意味着两个或多个进程已经锁定某些资源,但两个或多个线程或进程之间对于某些资源集存在循环依赖关系。

因此,无论@@LOCK_TIMEOUT 的值如何,都无法以这种方式防止死锁。请看Analyze Deadlocks with SQL Server Profiler的文章。

【讨论】:

  • 感谢您发布答案。正如我在上面的评论中解释 Mitch 时,我的应用程序中的死锁发生在只有选择查询的页面上。我将浏览您发布的链接。但是不同进程中的两条select语句会不会造成死锁呢?
  • 还有一个问题。如果表有表锁,是否更有可能在行锁上出现死锁?
  • @Jay 问题不在于表锁,而是 2+ 表/页/行被 2+ 事务以不同的顺序锁定。检查所有事务是否以相同的顺序锁定资源。您需要在 Profiler 中捕获死锁并查看相关资源。看看我的简单例子"How to simulate and catch deadlock"
猜你喜欢
  • 2017-03-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多