sql - 锁定行以在 SQL Server 上读取?

标签 sql sql-server sql-server-2005

在 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/

相关文章:

c# - sql查询和下拉列表

c# - SQL连接性能问题

sql - 有没有办法延迟存储过程执行计划的编译?

sql-server-2005 - SQL Server 2008 相对于 SQL Server 2005 有何优势?

sql - Postgres 9.3 pg_stat_activity.query 长度不会改变

Mysql - 按列选择最高值

.net - 如何调整 DbFit 中的 CommandTImeout 以适应长时间运行的查询?

sql - 什么是更快的查询(选择名称....或选择顶部(1)名称

sql-server - SQL 查询,例如带有 OR 条件的 GROUP BY

sql - 你如何在 PostgreSQL 8.3 中重写查询