【问题标题】:How to reduce deadlocks on select statement如何减少 select 语句的死锁
【发布时间】:2015-10-01 06:32:03
【问题描述】:

有人知道如何解决这个问题吗?当我跟踪错误时。我看到一段代码调用了这个查询。

SqlException : 事务(进程 ID 57)在锁上死锁

SELECT A.[CallID]
FROM dbo.[Calls] A WITH(NOLOCK)
INNER JOIN [dbo].[Issues] B WITH(NOLOCK) ON A.[CallID] = B.[CallID]
WHERE A.[AddedByUserID] = @UserID
  AND A.[EndTime] IS NULL
  AND DATEDIFF(d,A.AddedOn,GETDATE()) <= 1

我对@9​​87654322@ 的理解是防止死锁。但是为什么我会遇到这个错误?

【问题讨论】:

  • 首先WITH NOLOCK 不是消除并发问题的魔法棒。其次,它可能会导致 dirty reads 。最后,当 DDL 发生时,WITH (NOLOCK) 可以被 SCHEMA STABILITY LOCK 阻止。
  • 您还应该查看所涉及的 SQL 的锁定和读取模式。索引可能会解决您的问题,更改 SQL 也可以。根据这些数据的用途,NOLOCK 可能会导致更大的死锁问题。

标签: asp.net sql-server deadlock


【解决方案1】:

您可以尝试开启read committed snapshot,这样select 就不会占用任何锁并获得一致的读取。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-02-28
    • 1970-01-01
    • 2019-09-08
    • 1970-01-01
    • 1970-01-01
    • 2020-07-14
    • 2010-10-14
    • 1970-01-01
    相关资源
    最近更新 更多