我试着读了一篇关于锁和死锁的文章,它就是不能落地,所有不同类型的锁。我们正在运行两个不同的进程,试图编辑同一个表中的记录。第一个过程读取新数据并将其发送到外部方并相应地更新状态,另一个过程从外部方接收接收方的结果并相应地更新状态。
现在我们越来越多地得到死锁(在这种情况下,两个死锁中的一个是代理,并被中止)。到目前为止一切顺利,因为你可以预料到这一点,并尝试重新运行语句,但总是发生相同的死锁。这就是我的第一个问题:为什么相同的死锁总是重复发生?
其次,有没有一种方法可以告诉dbms,当另一个进程已经在读取和更新记录时,不要尝试获取记录的独占锁(我们通过存储过程更新单个记录),但是要“在一旁等待”,直到另一个进程准备就绪?或者,对于死锁来说,这是一件太简单的事情吗?
第三,有没有一种方法可以问LINQ to SQL是哪些锁导致了问题,这样我就可以更深入地了解进程的哪些部分导致了问题。
发布于 2010-08-31 00:42:11
正如@Darryl Peterson指出的那样,SQL Profiler是捕获死锁信息的好工具。如果您不知道何时会发生死锁,则可以设置SQL Server跟踪标志来捕获数据。
DBCC TRACEON (1204) 发生死锁时,有关死锁的信息将写入SQL Server错误日志。
有许多方法可以获得死锁。您的第一个问题“为什么总是发生相同的死锁”可能是一个好兆头。如果死锁是可重复的,那么您可以捕获它并修复它。
关于您的第二个问题,SQL Server可能已经告诉一个进程等待另一个进程完成。然而,你不能通过等待来避免死锁。死锁是指一个进程试图使用另一个进程持有的资源的情况。但是另一个进程正在等待第一个进程持有的资源。这两个进程在完成其工作之前都不会释放资源。请注意,这只是一个简单的解释,可能存在更复杂的死锁条件。关键是死锁中的进程永远不会能够完成。
一旦您对死锁中涉及的进程有了更多的了解,您应该能够采取措施来避免它。
发布于 2010-08-30 22:06:43
SQL事件探查器是我开始尝试解决SQL Server中的死锁问题的最好工具。
开始跟踪:在events Selection选项卡上:取消选中所有预先选择的事件。选中“显示所有事件”。展开"Locks“。检查"Deadlock graph“、"Lock: Deadlock”和"Lock Deadlock Chain“。
运行跟踪并捕获死锁事件。
在SQL事件探查器中查看死锁事件。死锁显示效果非常好。您可能仍然需要查看原始XML以获取更多详细信息。
使用您在第一次遍历中找到的内容,可能会为您提供关于要更改哪些内容的想法,或者建议在SQL Profiler中跟踪其他事件。
https://stackoverflow.com/questions/3600752
复制相似问题