这可能是一个愚蠢的问题,但我真的不确定创建这些存储过程的方式是否会导致任何问题。
我选择的存储过程如下所示:
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