我有一个sql表Tasks有列IdState。我需要执行以下操作:查找任何一个状态为ReadyForProcessing的任务,检索其所有列并将其状态设置为Processing。类似(伪代码):

BEGIN TRANSACTION;
SELECT TOP 1 * FROM Tasks WHERE State = ReadyForProcessing
// here check if the result set is not empty and get the id, then
UPDATE Tasks SET State = Processing WHERE TaskId = RetrievedTaskId
END TRANSACTION

此查询将从多个数据库客户端并行运行,其思想是,如果两个客户端并行运行查询,它们将获取不同的任务,而不是同一个任务。
看来我需要锁定提示。我读过但什么都不懂。如何使用锁定提示来解决上述问题?

最佳答案

这应该能起到作用。

BEGIN TRANSACTION
DECLARE @taskId
SELECT TOP (1) @taskid = TaskId FROM Tasks WITH (UPDLOCK, READPAST) WHERE State = 'ReadyForProcessing'
UPDATE Tasks SET State = 'Processing' WHERE TaskId = @taskid
COMMIT TRAN

关于sql-server - 如何使用锁定提示,以便两个并行查询返回不相交的结果?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5433567/

10-09 13:14