【发布时间】:2019-10-10 14:18:40
【问题描述】:
我计划为仅使用 SQL Server 表的用户实现一种工作队列。一行将一次仅分配给一个用户。我打算走一条普通的UPDATE SET .. WHERE .. 路线,就像这个问题中提出的那样:
https://stackoverflow.com/a/9241466
以下是相关部分,引用:
;WITH CTE AS
(
SELECT TOP 100 *
FROM T1
ORDER BY F2
)
UPDATE CTE SET F1='foo'
为了确保只有一个用户实际可以编辑一行,我将包含一个附加属性 UserId,并在 WHERE 子句中检查 NULL。
;WITH CTE AS
(
SELECT TOP 5 *
FROM T1
WHERE UserId IS NULL
ORDER BY F2
)
UPDATE CTE SET UserId = @userid
语句完成后,我会SELECT数据库中受影响的行。
但是,我可能想在我的WHERE 子句中包含一些额外的属性,以及一些额外的排序。
如果包含WHERE,UPDATE 将锁定行,但是当WHERE 包含在CTE 中时,情况仍然如此吗?
我的问题是,换一种说法,UPDATE 是否仍会锁定行,或者两个同时运行的语句是否有可能因为赛车问题而覆盖 UserId?
【问题讨论】:
标签: sql sql-server tsql