如何在SQL Server 2005中删除死锁?

时间:2012-05-03 10:07:01

标签: sql-server-2005 deadlock database-deadlocks

首先,我想知道SQL Server 2005中死锁的实际根本原因是什么。是因为当两个进程访问表中的同一行时?

无论如何,请考虑两个表_Table_Now__Table_History_,两个表都具有相同的结构。

假设有一列名为NAME

因此,当一个进程尝试在NAME='BLUE'中使用_Table_Now_更新记录时,首先需要将当前行NAME='BLUE'放入_Table_History_然后更新 _Table_Now_,并删除_Table_History_以前显示的行。

删除时发生死锁。我不明白为什么?

请指导我!

2 个答案:

答案 0 :(得分:1)

死锁基本上意味着当进程A依赖于进程B并且进程B依赖于进程A时,所以A将在B结束时开始\继续,而B将仅在A结束时继续\继续

您可能遇到的是表(或行)锁,因此SQL会在更新表之前锁定该行,以确保在执行更新时没有其他进程尝试访问该行。

您能更具体地了解如何进行insert \ update \ delete。在这种情况下你不应该有死锁。

仅供参考,请勿使用with (NOLOCK)。它会阻止锁定,但它会通过告诉SQL Server读取未提交的数据来实现,并且最终会导致数据不一致。

答案 1 :(得分:0)

当进程A等待进程B释放资源并且进程B正在等待进程A释放资源时发生死锁。

如果我正确理解更新的顺序,那就是:
1.在Table_Now中读取一行 2.更新Table_History中的一行 3.更新Table_Now中的一行 4.删除Table_History中的一行。

如果您使用交易或锁定不正确,这可能是一个危险的订单。

为避免死锁,您应该执行每个进程:
1.开始交易(最好是表锁)
2.执行所有DB操作
3.提交事务(或在数据库更新时发生任何问题时回滚)

这将确保每个进程锁定两个表,执行所有操作然后退出。

如果您已在使用交易,您使用的是什么范围和级别?如果没有,介绍交易。它应该解决问题。