更新死锁问题

时间:2015-01-29 19:48:53

标签: sql-server sql-server-2005

我正在使用SQL Server 2005并遇到死锁问题。我已经开始阅读NO LOCK,但我不确定这是解决问题的正确方法。非常感谢任何帮助。

我有一个每15秒运行一次的批处理。它根据外键列表生成动态UPDATE SQL语句。为了简化,想象一下下面简单的SQL语句:

UPDATE dual
SET val1 = @val1
WHERE fk = @fk
;

请记住,此示例已过度简化,对于每个外键,SQL语句实际上是不同的,但它更新的表和值始终相同。我不能只写一个更新语句来同时处理所有外键。

如果我一次运行一个语句,一切正常,但我冒险超过15秒的时间间隔。作为一个银弹,我决定多批处理批处理应用程序,这样它一次运行25个更新语句,而不是一次运行1个。执行此操作后,我开始收到死锁错误。

如何解决此死锁问题?要记住三件事:

  1. 批处理是唯一一个INSERT,UPDATE或 从相关表中删除记录
  2. 每个UPDATE语句都使用WHERE子句中的外键,所以 批次永远不会一次访问同一记录
  3. 如果记录得到错误的数据,批处理会自动纠正它 下次运行

1 个答案:

答案 0 :(得分:0)

在动态sql中创建一个表变量并将值插入其中,而不是当前的设置。这都是插入的,所以你不必担心死锁。接下来,通过将表变量连接到真实表,使用单个更新来更新表。这样,您只需使用一个更新语句来访问您的实际表。