删除和选择不同存储过程中的并发



这可能是一个愚蠢的问题,但我真的不确定创建这些存储过程的方式是否会导致任何问题。

我选择的存储过程如下所示:

ALTER PROCEDURE [dbo].[GetSRPsToProcess]
    @CurrentTime DateTime
AS
BEGIN
    BEGIN TRAN Tran1
        Select TOP 20 *
        From SRPQueue WITH (updlock, ROWLOCK, readpast)
        WHERE SRPQueue.TimeToDequeue <= @CurrentTime AND SRPQueue.Status = 'Pending'
        ORDER BY SRPQueue_Index 
    COMMIT
END

我的删除过程看起来是这样的(并且最终还将包含对日志表的插入):

ALTER PROCEDURE [dbo].[DequeueRelevantSRPs]
    -- Add the parameters for the stored procedure here
    @SRPQueue_Index int,
    -- @TimeDeleted datetime
AS
BEGIN
    BEGIN TRAN Tran1
        Delete
        FROM SRPQueue
        WHERE SRPQueue.SRPQueue_Index = @SRPQueue_Index
    COMMIT
END

避免我的DequeueRelevantSRPs存储过程尝试删除已选择的锁定行(并且失败)的问题的最佳做法是使用SRPPueue.Status变量吗?

这将是很好的,因为我可以有几个不同的状态(挂起、处理、就绪、失败),我只需要一个额外的and SRPQueueue.Status='ready'检查。有没有其他方法可以确保删除成功,尽管可能会锁定它?

编辑:调用这些存储过程的应用程序将在多台服务器上的多个实例中运行。这是一个重要的细节>.>。

Insert、Update和Delete指令锁定事务中的表,Select Wait for The Tables unlock。。。

我将在没有TRAN 的情况下进行第一次SP

ALTER PROCEDURE [dbo].[GetSRPsToProcess]
    @CurrentTime DateTime
AS
BEGIN
        Select TOP 20 *
        From SRPQueue WITH (updlock, ROWLOCK, readpast)
        WHERE SRPQueue.TimeToDequeue <= @CurrentTime AND SRPQueue.Status = 'Pending'
        ORDER BY SRPQueue_Index 
END

最新更新