2

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

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

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 存储过程尝试删除已选择的锁定行(并且失败)的最佳实践是使用 SRPQueue.Status 变量吗?

这会很好,因为我可以有几个不同的状态(待处理、处理、准备好、失败),我只需要一个额外的 AND SRPQueue.Status = 'Ready' 检查。尽管有潜在的锁定,是否有另一种方法可以确保删除成功?

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

4

1 回答 1

0

插入、更新和删除指令锁定事务中的表,选择等待表解锁...

我将在没有 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
于 2013-02-19T23:21:49.027 回答