Java SQL Server死锁解决

Java SQL Server死锁解决,java,sql-server,performance,deadlock,database-deadlocks,Java,Sql Server,Performance,Deadlock,Database Deadlocks,我面临着一个有关SQL Server数据库死锁的问题,我想知道如何开始寻找解决方案 我第一次遇到死锁是在运行模拟10个并发用户的JMeter脚本时。我在SQL探查器中运行了一个跟踪,发现死锁中涉及的两个查询是同一个SELECT查询。我通过向它们添加NOLOCK提示很快解决了这个问题 在此之后,又发生了一个死锁,我通过在Java应用程序中同步一个方法来修复它们。然后又出现了一个僵局,我认为这不是解决这个挑战的方法 有趣且令人欣慰的是,死锁都发生在同一张表上。此表是我的应用程序的核心表,所有死锁都与

我面临着一个有关SQL Server数据库死锁的问题,我想知道如何开始寻找解决方案

我第一次遇到死锁是在运行模拟10个并发用户的JMeter脚本时。我在SQL探查器中运行了一个跟踪,发现死锁中涉及的两个查询是同一个SELECT查询。我通过向它们添加NOLOCK提示很快解决了这个问题

在此之后,又发生了一个死锁,我通过在Java应用程序中同步一个方法来修复它们。然后又出现了一个僵局,我认为这不是解决这个挑战的方法

有趣且令人欣慰的是,死锁都发生在同一张表上。此表是我的应用程序的核心表,所有死锁都与表上的5个索引之一相关

我没有足够的经验,不知道如何找出问题,把解决办法放在一边。 有人能告诉我如何处理这种情况吗


谢谢

如您所知,要找出根本原因可能非常困难。作为DBA,由于查询脱离上下文,很难单独解决。我在这方面看到的最大成功是,让开发人员和DBA彼此相邻,并在死锁发生时相互转换给定查询所做的事情。您使用探查器的方法是正确的,从应用程序的角度来看,您只需要额外的上下文,然后您应该开始了解SQL Server上出现问题的原因。这假设您不是开发人员和DBA。

是否有DB事务在任何存储过程中或通过锁定该表的应用程序在您的表上运行,以找到该事务,请运行下面的查询,查看是否有任何活动事务占用的时间太长并且被卡住

SELECT * FROM sys.dm_tran_database_transactions where database_id = ??
您可以从中找到数据库ID

SELECT * 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 

我没有在MS SQL Server上工作过,但可以告诉您要查看的一般指针

基本上,死锁是由于锁定而发生的。如果您找到了锁定/解锁的解决方案,您的问题就解决了

尝试优化参与锁的查询。 很多时候,单个查询会长时间运行以获取锁,而不能及时完成工作,因此其他查询会等待其完成,从而导致死锁。因此,首先尝试对查询进行otpimize,看看您是否正在获取所需的数据?如果您正在获取不必要的数据,请将其删除。通常读取会锁定行,如果锁列表中DB可用的最大锁数较低,则整个表都会被锁定,这将导致死锁

若您只是在读取数据,那个么使用已经完成的NOLOCK,而不是在DB中处理它。若逻辑复杂,那个么在应用程序中处理它

检查数据库调谐、统计信息。它们到位了吗? 如果不正确,请更正并再次检查

若以上所有的事情都不起作用,那个么最终将遇到困难的情况,比如水平拆分表,垂直拆分表,这需要应用程序知识和代码修改


希望这能有所帮助:

导致频繁死锁的最常见原因是1次优化的执行计划导致需要接触的数据过多,2次不一致的数据访问顺序一个线程更新第1行,然后更新第2行,另一个线程更新第2行,然后更新第1行。我建议您从索引和查询调优开始。考虑将数据库更改为Read PrimeType快照隔离,而不是使用NoLoCK提示。谢谢您的答复。我将尝试优化我的查询,并在有结果时发布结果。我将尝试使用这些语句来定位我的死锁。谢谢@Paali。