我有一张表。多个外部进程将同时查看它&更新它。
我想写一些SQL来更新"优先级最高的一行,它还没有被(另一个外部进程)更新"。
进程使用下面的SQL访问我的表。但我担心的是……如果两个进程几乎同时运行此代码,我不确定会发生什么。是否存在此代码的两个几乎同时存在的实例都试图更新同一行的风险?
我只想确保编写的代码(使用CTE)在单个事务中运行SELECT和UPDATE,而不需要多个进程选择&更新同一行。如果情况还不是这样,那么让我知道我需要改变什么才能实现这一点。
谢谢!
WITH MostUrgentWorkAssignment AS
(
SELECT TOP(1) *
FROM
dbo.WorkAssignments a
WHERE
a.UserID IS NULL
ORDER BY
a.Priority
)
UPDATE MostUrgentWorkAssignment
SET UserID = @UserID
TSQL不应该是这样的吗,避免不必要的CTE?
UPDATE [dbo].[WorkAssignments]
SET
[UserId] = @UserID
FROM
[dbo].[WorkAssignments] [A]
JOIN
(
SELECT TOP 1
[A].[Id]
FROM
[dbo].[WorkAssignments] [A]
WHERE
[A].[UserId] IS NULL
ORDER BY
[A].[Priority]
) [MostUrgentWorkAssignment]
ON [MostUrgentWorkAssignment].[Id] = [A].[Id];
如果你有一个合理的隔离级别,这个声明是安全的。select和update将在隐式事务中运行,因为它们是同一语句的一部分。我怀疑,无论有没有CTE,这都是同样正确的。