如何处理更新SQL Server中同一行的两个事务

时间:2013-02-04 12:19:18

标签: sql-server-2008

我有以下情况需要处理:

价值表:

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会发生什么。显然,人们会先到达那里。

我不知道如何测试这种情况,所以无法找到自己。

第二个用户是否超越了第一个用户? (直接或锁定释放后?)

第二个用户是否被锁定并收到错误? (如果是这样,我该如何检测错误?)

任何帮助都将不胜感激。

2 个答案:

答案 0 :(得分:1)

第二个用户将覆盖第一个用户。除非附在交易中,否则它不会被锁定。 检查此link ....

答案 1 :(得分:0)

好的,经过一些研究后我找到了自己的答案。

似乎我必须锁定表,执行更新,然后释放表锁。以下sql一次完成所有这些:

UPDATE top (1) mytable WITH (TABLOCKX)
SET flag = someUniqueValue
WHERE used = 0
  AND flag IS NULL

为了测试它,我运行了两个循环(每个循环10000次 - 有点超过顶部但是做了伎俩)。第一个循环粘贴一个值,第二个循环粘贴另一个值。最终结果表明,当两个循环完成运行时,表中每个值都有10000个。