1

我有以下情况,我想处理:

值表:

id int
val varchar(20)
used bit
flag int

我想找到第一行 WHERE used = 0 AND flag IS NULL 并在'flag'中粘贴一些东西。一旦完成,任何其他用户将无法使用该行(因为标志不为空)

当然,这很简单:

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

我想知道的是,如果两个用户同时运行相同的 UPDATE 会发生什么。显然,一个人会先到达那里。

我不知道如何去测试这个场景,所以无法找到自己。

第二个用户会覆盖第一个用户吗?(立即或在锁被释放后?)

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

任何帮助,将不胜感激。

4

2 回答 2

1

第二个用户将覆盖第一个用户。除非包含在事务中,否则它不会被锁定。检查此链接....

于 2013-02-04T13:13:32.900 回答
0

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

看来我必须锁定表,进行更新,然后释放表锁。以下 sql 一次性完成所有这些操作:

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

为了测试它,我运行了两个循环(每个循环 10000 个循环 - 有点过头但成功了)。第一个循环插入一个值,第二个循环插入另一个值。最终结果表明,当两个循环都运行完毕时,表中的每个值正好有 10000 个。

于 2013-02-04T13:15:30.413 回答