如果我遇到某种情况(我这样做,但改变情况不是一种选择),我会运行如下声明:
Update Table 1 Set Field 5 = 'Blah' Where Field5 IS NULL
并且该语句多次在同一时间运行,如何避免多个线程更新同一行?
答案 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在更新之前获取文件的独占锁定,然后释放锁定。