我有一个sql表Tasks
有列Id
和State
。我需要执行以下操作:查找任何一个状态为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/