在SQL位下,我想获取和删除匹配特定条件的表的下一行。但是,我想阻止执行相同位SQL的其他服务返回同一行。我正在考虑交易或行锁,但无法看到任何一个人会如何帮助我。在SQL Server上读取锁定行?
DECLARE @tblTempRow TABLE(intUserID int, intBlobID int)
-- Get the next match and remember in temp table. I want to prevent that other processes return the same row.
INSERT INTO @tblTempRow(intUserID, intBlobID)
SELECT TOP 1 intUserID, intBlobID FROM Schedule WHERE intScheduleType = @intScheduleType
-- Delete if requested.
IF(@intDeleteAfterGet = 1)
BEGIN
DELETE FROM
Schedule
WHERE
intUserID = (SELECT intUserID FROM @tblTempRow)
AND intBlobID = (SELECT intBlobID FROM @tblTempRow)
AND intScheduleType = @intScheduleType
END
-- Return the temp table.
SELECT intUserID, @intScheduleType, intBlobID FROM @tblTempRow
什么是READPAST查询提示? – Krumelur 2011-03-07 14:00:38
这是我认为最优雅的方式。谢谢! (顺便说一句:你的语法错误,它需要按照“DELETE TOP(1)... WITH()... OUTPUT ... WHERE”的顺序排列,因为OUTPUT会生成一个有效的结果集 – Krumelur 2011-03-07 14:14:40
@Krumelur - READPAST说如果一行被锁定,就忽略它,所以如果你有两个连接同时运行这个代码,一个会锁定并返回“第一个”行,第二个会忽略它,然后选择第二行 - 否则,第二个连接将等待锁定(以及之后的删除),然后才能得到“第二个”行。“引用中的第一个”和“第二个”是因为这里没有ORDER BY子句查询 – 2011-03-07 14:43:14