我有一个存储过程,它读取状态为x的行的ID,然后立即将行id设置为状态y。
由于这个存储过程是由多个客户端应用程序调用的,所以返回的是相同的值,而实际上2个执行应该在状态x中找不到任何值。
除了在begin transaction / commit中包装动作之外,我没有使用任何其他东西。
粗略的例子:
Begin Transaction
IF (@Param = '2') -- all
BEGIN
@resultID = (SELECT ... WHERE STATUS_ID = X
END
ELSE
BEGIN
@resultID = (SELECT ... WHERE STATUS_ID = X
END
IF (@ResultID > 0)
BEGIN
UPDATE JOB_QUEUE SET STATUS_ID = Y WHERE ID = @ResultID
END
COMMIT
SELECT * from JOB_QUEUE WHERE ID = @ResultID
不知怎的,查询已经从表中返回了相同的@resultID
..所以我认为我需要一些锁定或其他东西来防止这种情况。
是否有一种方法可以确保同时执行存储过程导致一个执行然后另一个(顺序执行)?
感谢。
答案 0 :(得分:0)
简单的答案是加快整个过程 - 如果它是一个运行缓慢的查询,那么select可以在更新完成之前运行。
如果您需要为其他报告选择值,您可以有效地将更新作为第一个语句运行,并使用OUTPUT关键字返回更新记录的ID,例如:
UPDATE JOB_QUEUE
SET STATUS_ID = Y WHERE STATUS_ID = X
OUTPUT inserted.ID