有没有办法防止死锁(会发生什么,一个是受害者)

时间:2010-08-30 13:26:18

标签: sql-server linq-to-sql deadlock

我试过阅读一篇关于锁和死锁的文章,它只是没有降落,不同类型的锁。 我们正在运行2个不同的进程,这些进程尝试在同一个表中编辑记录。 第一个进程读取新数据并将其发送给外部方并相应地更新状态,另一个进程从外部方接收结果并相应地更新状态。

现在我们越来越多地遇到死锁(在这种情况下,其中一个是胜利并被中止)。到目前为止这么好,因为你可以预见到这一点,并尝试重新运行该语句,但总是发生同样的死锁。 所以这是我的第一个问题:为什么同样的死锁总是再次发生?

第二,有没有办法告诉dbms不要尝试获取记录的独占锁(我们通过存储过程更新单个记录)当另一个进程已经在读取并更新它时,但是'等待'直到另一个过程准备好了? 或者说关于僵局的事情太简单了?

并且可能是第三,有没有办法向LINQ to SQL询问哪些锁导致了问题,所以我对进程的哪些部分导致问题有了更多的了解。

2 个答案:

答案 0 :(得分:4)

SQL Profiler是我用来开始尝试解决SQL Server中的死锁问题的最佳工具。

开始追踪: 在“事件选择”选项卡上: 取消选中所有预选事件。 选中“显示所有活动”。 展开“锁定”。 检查“死锁图”,“锁定:死锁”和“锁定死锁链”。

运行跟踪并捕获死锁事件。

在SQL事件探查器中查看死锁事件。死锁显示非常好。您可能仍需要查看原始XML以获取其他详细信息。

使用您在第一遍中找到的内容,可以为您提供有关更改内容的建议,或建议在SQL事件探查器中跟踪其他事件。

答案 1 :(得分:1)

正如@Darryl Peterson所指出的,SQL Profiler是捕获死锁信息的好工具。如果您不知道何时发生死锁,可以设置SQL Server跟踪标志以捕获数据。

DBCC TRACEON (1204) 

发生死锁时,有关死锁的信息将写入SQL Server错误日志。

有很多方法可以解决僵局。你的第一个问题“为什么总是会发生同样的死锁”可能是一个好兆头。如果死锁是可重复的,那么你可以捕获并修复它。

关于第二个问题,SQL Server可能已经告诉一个进程在另一个进程完成时等待。但是,您无法通过等待来避免死锁。死锁是一个进程正在尝试使用另一个进程持有的资源的情况。但是另一个进程正在等待第一个进程持有的资源。在完成其工作之前,这两个进程都不会释放资源。请注意,这是一个简单的解释,可能存在更复杂的死锁条件。重点是死锁中的进程永远不会能够完成。

一旦您了解了有关死锁所涉及的进程的更多信息,您就应该采取措施避免死锁。