我面临着关于SQL Server数据库死锁的问题,我想知道如何开始寻找解决方案。
我在运行JMeter脚本时首先遇到死锁,该脚本模拟了10个并发用户。我在SQL事件探查器中运行了跟踪,我注意到死锁中涉及的两个查询是相同的SELECT查询。我通过向他们添加NOLOCK提示很快解决了这个问题。
在此之后,发生了另一个死锁,我通过在我的Java应用程序中同步一个方法来修复它们。然后发生了另一次僵局,我认为这不是解决这一挑战的方法。
有趣和令人欣慰的是,死锁都发生在同一张桌子上。此表是我的应用程序的核心表,所有死锁都与表中的5个索引之一相关。
我没有足够的经验知道如何查明问题,不考虑解决方案。 有没有人可以告诉我如何处理这种情况?
谢谢
答案 0 :(得分:0)
这些可能很难隔离根本原因(如您所知)。作为DBA,由于查询脱离了上下文,因此很难单独解决。我在这方面看到的最大的成功,就是让开发人员和DBA彼此相邻,并在发生死锁时给出查询所做的事情之间进行相互转换。您使用Profiler的方法是正确的,您只需从应用程序的角度来看需要额外的上下文,然后您应该开始了解为什么您在SQL Server上遇到问题。 (这假设你不是开发者和DBA)。
答案 1 :(得分:0)
在任何存储过程中是否在您的表上运行数据库事务,或者通过锁定表的应用程序运行数据库事务,以查找运行以下查询以查看是否存在任何占用时间过长而且卡住的活动事务< / p>
SELECT * FROM sys.dm_tran_database_transactions where database_id = ??
您可以从
中找到数据库IDSELECT * FROM sys.databases
使用以下查询检查实时死锁
SELECT * FROM sys.sysprocesses WHERE blocked >0
其他一些可以帮助您解决数据库问题的查询是
SELECT * FROM sys.dm_tran_locks
SELECT * FROM sys.dm_tran_current_transaction
SELECT * FROM sys.dm_os_wait_stats
SELECT * FROM sysobjects
答案 2 :(得分:0)
我没有在MS SQL Server上工作,但可以告诉你一般的指示,
由于锁定,基本上会发生死锁。如果你找到锁定/解锁的解决方案你的问题就解决了。
很多时候单个查询长时间运行获取锁定并且没有及时完成工作,因此其他查询等待其完成,这反过来导致死锁。所以首先尝试otpimize查询,看看你是否提取所需的数据?如果您要获取不必要的数据,请将其删除。通常读取会锁定行,如果您的锁定列表(最大可用于DB的锁定数量)较低,则整个表将被锁定,这将导致死锁。
如果您只是阅读数据,那么使用NOLOCK(您已经完成),而不是在逻辑很复杂的情况下在DB中处理它,然后在应用程序中处理它
检查数据库调整,统计信息。它们到位了吗? 如果不正确,再次检查
如果以上所有方法都不起作用,那么最后会遇到一些困难的情况,例如水平,垂直拆分表,这需要应用知识和代码修改。
希望这会有所帮助:)