Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/258.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# SQL Server遇到死锁,未选择受害者_C#_Sql Server_Tsql_Deadlock_Blocking - Fatal编程技术网

C# SQL Server遇到死锁,未选择受害者

C# SQL Server遇到死锁,未选择受害者,c#,sql-server,tsql,deadlock,blocking,C#,Sql Server,Tsql,Deadlock,Blocking,我在SQLServer2005中遇到了一个问题。存储过程在PowerBuilder应用程序中运行,然后调用运行不同存储过程的C DLL库 第一个过程根据条件对表执行一些删除,第二个过程将该表用作主数据源,以便插入到不同的表中。这些过程使用一些相同的联接表进行选择,但只修改了一个表 问题是,这种设置有时会死锁,但SQL Server不会对此采取任何措施。DLL库中有try/catch语句,如果它调用的过程由于死锁而被终止,它将记录一个错误,但是库只是坐在那里等待过程完成。我让它静置了10分钟,它仍

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

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

问题是,这种设置有时会死锁,但SQL Server不会对此采取任何措施。DLL库中有try/catch语句,如果它调用的过程由于死锁而被终止,它将记录一个错误,但是库只是坐在那里等待过程完成。我让它静置了10分钟,它仍然处于僵局

我尝试在第二个过程中使用DEADLOCK_PRIORITY LOW语句,因为它需要等待删除完成后才能选择。我还尝试将select语句缩减为一个表来测试它,但它仍然会遇到死锁。我还尝试将TRY/CATCH块与BEGIN事务一起使用,以便捕获两个过程中的死锁,但这也没有帮助


如果事务被阻止,是否有办法强制SQL Server终止该事务?我可以处理DLL中的错误,但是如果SQL Server没有返回错误,只是坐在那里,我就不能处理它。谢谢

我想看看这篇文章:

它谈到减少SQL Server锁,这可能是您在这里遇到的问题的一部分。我建议您使用table/page页面上的lock设置打开/关闭locks,看看这是否有助于解决这种情况


不要试图对问题进行修补,而要设法解决根本原因

如果是明显的死锁,则应选择受害者,但是,如果我们正在处理资源等待,即在重大更改后等待索引恢复联机,则选择将静坐等待。我知道有些人认为这是一个肮脏的词,但诺洛克在这里不是一个可能的朋友吗?是的,我知道这可能会导致读取的数据在您读取时可能已过期未提交插入、删除和更新等?如果你确定这是一个死锁,你能告诉我们你得到了什么样的等待类型吗?HeavenCore指出了一个重要的区别。死锁永远不会结束,但资源等待最终会结束?在某些相同的联接表上,选择可能发生死锁的位置。如果这两个存储过程是静态的,或者可以在这两个存储过程期间被视为静态的,则使用nolock连接到这些表。对于更新表,请使用行锁。谢谢,在浏览链接后,我能够解决此问题。使用SET LOCK_TIMEOUT可确保第二个过程不会卡住。这是困扰我的主要问题。通过从第二个过程中删除表中的delete,我能够解决根本问题。现在似乎工作得很好。