这可能是一个愚蠢的问题,但我不确定我创建这些存储过程的方式是否会导致任何问题。
我的选择存储过程如下所示:
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' 检查。尽管有潜在的锁定,是否有另一种方法可以确保删除成功?
编辑:调用这些存储过程的应用程序将在多个服务器上的多个实例中运行。一个重要的细节>.>。