我正在使用SQL Server 2005并遇到死锁问题。我已经开始阅读NO LOCK,但我不确定这是解决问题的正确方法。非常感谢任何帮助。
我有一个每15秒运行一次的批处理。它根据外键列表生成动态UPDATE SQL语句。为了简化,想象一下下面简单的SQL语句:
UPDATE dual
SET val1 = @val1
WHERE fk = @fk
;
请记住,此示例已过度简化,对于每个外键,SQL语句实际上是不同的,但它更新的表和值始终相同。我不能只写一个更新语句来同时处理所有外键。
如果我一次运行一个语句,一切正常,但我冒险超过15秒的时间间隔。作为一个银弹,我决定多批处理批处理应用程序,这样它一次运行25个更新语句,而不是一次运行1个。执行此操作后,我开始收到死锁错误。
如何解决此死锁问题?要记住三件事:
答案 0 :(得分:0)
在动态sql中创建一个表变量并将值插入其中,而不是当前的设置。这都是插入的,所以你不必担心死锁。接下来,通过将表变量连接到真实表,使用单个更新来更新表。这样,您只需使用一个更新语句来访问您的实际表。