Sql server 索引导致的SQL死锁

Sql server 索引导致的SQL死锁,sql-server,locking,deadlock,Sql Server,Locking,Deadlock,插入和选择之间存在死锁问题 连接A: 在表MyTable中插入记录(记录上的X锁) 更新非聚集索引MyTable_索引(请求索引项上的X锁) 连接B: 使用MyTable_索引查找具有特定目标(MyTable列)的记录(索引项上的S锁) 通过索引返回(选择)MyTable记录。(这是随后更新记录的子查询)(请求S对记录的锁定) 因此,当A插入(步骤1)和B使用索引(步骤1)时,似乎会发生死锁。连接A和B都使用ROWLOCK提示 有没有一种方法可以为连接B指定MyTable_索引不应该被锁定,就像

插入和选择之间存在死锁问题

连接A:

  • 在表MyTable中插入记录(记录上的X锁)
  • 更新非聚集索引MyTable_索引(请求索引项上的X锁)
  • 连接B:

  • 使用MyTable_索引查找具有特定目标(MyTable列)的记录(索引项上的S锁)
  • 通过索引返回(选择)MyTable记录。(这是随后更新记录的子查询)(请求S对记录的锁定)
  • 因此,当A插入(步骤1)和B使用索引(步骤1)时,似乎会发生死锁。连接A和B都使用ROWLOCK提示

    有没有一种方法可以为连接B指定MyTable_索引不应该被锁定,就像表的NOLOCK一样,但现在是索引的NOLOCK

    或者其他一些聪明的技巧(除了删除索引或使用聚集索引)


    期待一些智能解决方案:-)

    查看此问题和提供的答案:这些是在事务中运行的吗?如果是,事务隔离级别是什么?您是否查看过
    serializable
    或使用
    updlock
    和/或
    holdlock
    ?在这里向我们展示一些实际的代码会有很大帮助。我会启动一个SQL跟踪(使用SQL Profiler)或一个扩展的事件会话来截获[xml]死锁图事件。然后我将匿名化并在这里发布xml。这应该是我们调试此类异常的第一步