首先,我想知道SQL Server 2005中死锁的实际根本原因是什么。是因为当两个进程访问表中的同一行时?
无论如何,请考虑两个表_Table_Now_
和_Table_History_
,两个表都具有相同的结构。
假设有一列名为NAME
。
因此,当一个进程尝试在NAME='BLUE'
中使用_Table_Now_
更新记录时,首先需要将当前行NAME='BLUE'
放入_Table_History_
然后更新
_Table_Now_
,并删除_Table_History_
以前显示的行。
删除时发生死锁。我不明白为什么?
请指导我!
答案 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.提交事务(或在数据库更新时发生任何问题时回滚)
这将确保每个进程锁定两个表,执行所有操作然后退出。
如果您已在使用交易,您使用的是什么范围和级别?如果没有,介绍交易。它应该解决问题。