在 SQL 中,我想获取并删除符合特定条件的表的下一行。但是,我想防止其他服务执行相同的 SQL 位以返回相同的行。我在考虑事务或行锁,但看不出任何一个对我有什么帮助。
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
最佳答案
在这种情况下,您最好直接执行删除,并使用 OUTPUT clause填充您的表。那应该自动为您管理锁。 TODO:处理没有匹配的行,但你已经遇到了这个问题。
DECLARE @tblTempRow TABLE(intUserID int, intBlobID int)
IF(@intDeleteAfterGet = 1)
begin
DELETE TOP 1 FROM Schedule WITH (READPAST) WHERE intScheduleType = @intScheduleType
OUTPUT deleted.intUserID,deleted.intBlobID INTO @tblTempRow
end
else
begin
INSERT INTO @tblTempRow(intUserID, intBlobID)
SELECT TOP 1 intUserID, intBlobID FROM Schedule WHERE intScheduleType = @intScheduleType
end
-- Return the temp table.
SELECT intUserID, @intScheduleType, intBlobID FROM @tblTempRow
关于sql - 锁定行以在 SQL Server 上读取?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5220431/