代码之家  ›  专栏  ›  技术社区  ›  Randy Minder

更新锁导致的死锁问题

  •  2
  • Randy Minder  · 技术社区  · 15 年前

    我们有一个死锁的问题,我们正在努力追查。我有一个由分析器生成的死锁图(XDL)。它将丢失的SQL语句显示为简单的select语句,而不是update、delete或insert语句。该图将丢失的select语句显示为请求资源上的共享锁。 **but also owning an Update lock on a resource** . 这就是困扰我的地方。为什么不属于insert、update或delete的select语句对资源持有更新锁?

    我应该补充一点,它拥有的更新锁在lossselect语句所针对的表上。

    编辑:请不要建议使用nolock。是的,这可以解决这个问题,但引入了一个新的问题——脏读问题。此查询正在访问生产服务器。我真正想知道的是为什么select语句会发出更新锁。

    3 回复  |  直到 15 年前
        1
  •  6
  •   Remus Rusanu    15 年前

    你确定选择 拥有 U锁?

    如您所知,U和X锁(以及可序列化的S锁)在 交易 不是声明。因此,对于从先前执行的语句发出写操作以拥有U锁的事务来说,这是完全可能的。为什么它拥有U形锁,而不是X形锁(即它拥有U形锁 没有升级到X )这本身就是一个谜,但我可以预见这可能发生的两种方式。
    因此,如果选择语句是多语句事务的一部分,那么拥有X/U锁是完全可能的。一个独立的选择,在它的皮带下有一个U锁,这是有点不寻常,我想。

    典型的select与update死锁发生在索引访问顺序场景中,如 Read/Write deadlock . 我相信你是认真读过死锁图的,但是如果不是问得太多,你能分享一下吗?

    哦,顺便说一句,您考虑过读提交快照吗?

        2
  •  1
  •   Prashant    15 年前

    select语句不会创建共享锁。尝试使用nolock提示选择。它可以解决这个问题。

    例如select*from table(nolock)

        3
  •  0
  •   A-K    15 年前

    可能是用updlock提示调用了select? 无论如何,您可以使用快照隔离并消除问题吗?