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

锁定问题-何时发出更新(U)锁定?

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

    我们正在努力解决僵局问题。正在回滚的事务正试图对另一个事务具有独占(X)锁的资源发出更新(U)锁。根据网上的书( http://msdn.microsoft.com/en-us/library/ms175519.aspx )更新锁应该可以防止死锁,而不是导致死锁。

    所以,我的问题是,为什么/什么时候将更新锁应用于资源?我们对此有点困惑,因为试图将更新锁应用到的资源 will not 由正在回滚事务的进程更新。

    谢谢你在这方面的帮助。

    兰迪

    3 回复  |  直到 14 年前
        1
  •  0
  •   Philip Kelley    14 年前

    在导致僵局的原因背后有一个“假设”的宇宙(我的意思是,没有办法从你最初的帖子中分辨出到底发生了什么)。可能是表锁,也可能是索引锁;可能是不知道的独立事务;可能是表头锁,可能是tempdb问题(非常不可能),谁知道?

    我发现诊断死锁的最佳方法是这样的:

    • 启动SQL事件探查器,将其配置为“死锁图”和“lock:deadlock”事件,并确保包含textdata列
    • 当探查器运行时,导致应用程序生成死锁
    • 选择“死锁图”探查器行,您将得到一个简单但令人困惑的图形显示。这可能有助于你了解到底发生了什么。
    • 如果这不起作用,那么图形是由分析器基于一个非常详细的XML块生成的。提取此字符串(选择死锁图行,ctrl+c进行复制,粘贴到所选的文本编辑器中,删除除XML之外的所有列),然后查看XML(在首选的XML编辑器中)。

    到目前为止,一旦我了解并处理了那个XML,我总是能够找出导致死锁的原因。这是一个很好的方法来了解SQL的一些内部结构是多么的奇怪和复杂。

        2
  •  1
  •   Mitchel Sellers    14 年前

    您将需要做更多的研究,以了解实际锁定的内容、每个查询所处的隔离级别等。

    一些有用的资源。

    SQL Server Transaction Isolation Levels and their Locks

    SQL Server Lock Types and Lock Hints

        3
  •  0
  •   TomTom    14 年前

    可能您没有正确处理事务隔离,并且处于序列化事务模式。

    你应该

    • 在连接上使用适当的事务隔离。

    • 有时在SQL上使用提示,比如nolock提示,当您基本上只是读取一些数据,并且在事务中对它不做任何其他操作时。