SQL Server遇到死锁,不选择受害者

时间:2012-04-10 13:08:56

标签: c# sql-server tsql deadlock blocking

我在SQL Server 2005中遇到了一个问题。存储过程在PowerBuilder应用程序中运行,然后该应用程序调用运行不同存储过程的C#DLL库。

第一个过程根据条件对表执行一些删除,第二个过程使用该表作为主数据源,以便插入到不同的表中。这些过程使用了一些相同的连接表来进行选择,但只修改了一个表。

问题是此设置有时会出现死锁,但SQL Server对此没有任何作用。 DLL库中有try / catch语句,如果它调用的过程因死锁而被终止,则会记录错误,但是库只是等待该过程完成。我让它坐了10分钟,它仍然陷入僵局。

我尝试在第二个过程中使用DEADLOCK_PRIORITY LOW语句,因为它需要在选择之前等待删除完成。我还尝试将select语句简化为只有一个表来测试它,它仍然会遇到死锁。我还尝试使用带有BEGIN TRANSACTION的TRY / CATCH块来捕获这两个过程中的死锁,但这也无济于事。

有没有办法强制SQL Server在被阻止的情况下终止它?我可以处理DLL中的错误,但如果SQL Server没有返回错误并且只是坐在那里,我就无法对它做任何事情。谢谢!

1 个答案:

答案 0 :(得分:2)

我会看一下这篇文章:http://www.sql-server-performance.com/2006/reducing-locks/

它讨论了减少SQL Server锁定,这可能是您的问题的一部分。我建议玩桌面/页面上的锁定设置(PageLocks开/关),看看是否有助于这种情况。

尝试解决根本原因,而不是尝试对问题进行修补。