2更新查询在同一时间运行

时间:2011-01-03 14:52:21

标签: sql sql-server

如果我遇到某种情况(我这样做,但改变情况不是一种选择),我会运行如下声明:

Update Table 1 Set Field 5 = 'Blah' Where Field5 IS NULL

并且该语句多次在同一时间运行,如何避免多个线程更新同一行?

3 个答案:

答案 0 :(得分:3)

也许这是因为这里有一个“编造的例子”,但该语句对于给定的记录只会运行一次。

假设Field5为null:

Update Table 1 Set Field 5 = 'Blah' Where Field5 IS NULL

现在Field5 ='Blah'

第二次运行此声明......

Update Table 1 Set Field 5 = 'Blah' Where Field5 IS NULL

什么都不做。记录将保持原样,因为它不再包含在WHERE子句中。

答案 1 :(得分:1)

使用rowversion字段(在旧版本的mssql中称为timestamp)。无论进程产生什么进程,线程都需要检查当前rowversion,然后在update where子句中,您可以在rowversion子句中添加额外条件,以仅更新旧rowversion 。只要行中的任何字段发生更改,{{1}}字段就会自动更改,因此这将确保修改只发生一次。

注意:这是一个可怕的黑客。你最好修复你的线程以更聪明地分工。

答案 2 :(得分:0)

您还可以从脚本运行更新,同时在(虚拟)锁定文件上使用flock在更新之前获取文件的独占锁定,然后释放锁定。