我有一个T-SQL查询是这样的:更新这里选择,保证原子
UPDATE
[MyTable]
SET
[MyField] = @myValue
WHERE
[Id] =
(
SELECT TOP(1)
[Id]
FROM
[MyTable]
WHERE
[MyField] IS NULL
-- AND other conditions on [MyTable]
ORDER BY
[Id] ASC
)
看来,这个查询并不是原子(选择2个并发执行可以返回相同的ID两次)。
编辑: 如果我执行这个查询,SELECT返回的Id将不能用于下一次执行(因为[MyField]不会再为NULL)。但是,如果我同时执行两次这个查询,两次执行都会返回相同的ID(第二个UPDATE会覆盖第一个)。
我读过一个解决方案,以避免使用SERIALIZABLE隔离级别。那是最好/最快/最简单的方法吗?
你是什么意思似乎?这应该只返回一个值。除非你使用'WITH TIES'选项。 –
'select可以返回相同的ID两次'。嗯,它可能会总是返回相同的ID。 – sagi
@sagi如果更新没有被执行。 – krimog