我有一个 SQL 表Tasks
有柱子Id
and 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
该查询将从多个数据库客户端并行运行,其想法是,如果两个客户端并行运行查询,它们将获取不同的任务,而且绝不是相同的任务。
看来我需要锁定提示。我读了这篇 MSDN 文章但不明白那里有什么。如何使用锁定提示来解决上述问题?
这应该可以解决问题。
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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)