我有以下情况需要处理:
价值表:
id int
val varchar(20)
used bit
flag int
我想找到第一行WHERE使用= 0并且标志为IS NULL并在'flag'中粘贴一些东西。一旦完成,任何其他用户将无法使用该行(因为标志不为空)
当然这很简单:
UPDATE top (1) mytable
SET flag = someUniqueValue
WHERE used = 0
AND flag IS NULL
我想知道的是,如果两个用户同时运行相同的UPDATE会发生什么。显然,人们会先到达那里。
我不知道如何测试这种情况,所以无法找到自己。
第二个用户是否超越了第一个用户? (直接或锁定释放后?)
第二个用户是否被锁定并收到错误? (如果是这样,我该如何检测错误?)
任何帮助都将不胜感激。
答案 0 :(得分:1)
第二个用户将覆盖第一个用户。除非附在交易中,否则它不会被锁定。 检查此link ....
答案 1 :(得分:0)
好的,经过一些研究后我找到了自己的答案。
似乎我必须锁定表,执行更新,然后释放表锁。以下sql一次完成所有这些:
UPDATE top (1) mytable WITH (TABLOCKX)
SET flag = someUniqueValue
WHERE used = 0
AND flag IS NULL
为了测试它,我运行了两个循环(每个循环10000次 - 有点超过顶部但是做了伎俩)。第一个循环粘贴一个值,第二个循环粘贴另一个值。最终结果表明,当两个循环完成运行时,表中每个值都有10000个。