我有一个奇特的情况。我有代码的不同部分和数千个客户端不断访问的表,因此在对表上进行简单更新和插入时,我们使用了交易的使用。问题是我们不断遇到死锁错误。有人知道我如何减轻这个问题?

有帮助吗?

解决方案

可能出于多种原因及其组合出现僵局:

  • 模式设计差

  • 查询工作量的错误索引不正确

  • 写得不好的TSQL

  • 积极的交易隔离水平和/或长期运行的开放交易

  • 应用程序访问模式不良

  • 低规格或错误配置的硬件

所有这些都是常见的。

我建议你读

其他提示

这个问题不太奇怪 - 当开发人员对锁定的工作原理不了解并将交易视为“黑匣子”并期望其解决方案扩展时,这是典型的。

米奇(Mitch)在关于付款专家的评论中是正确的 - 对于任何解决方案而言,这都是一个太大的问题。您将需要武装造成僵局的查询痕迹,并且必须分析从索引到表设计,到交易隔离级别,再到查询模式的所有内容。

我建议从SQL Server Profiler开始,然后设置将生成死锁图的跟踪。这至少将确定您的问题查询和正在僵持的资源。设置另一个跟踪,以寻找缓慢的查询(>“说,100ms),并加快速度。查询运行的时间越长,锁定争论的概率越高。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top