SQL 顺序等待和执行的存储过程
SQL stored procedure waiting and executing sequentially
我有一个存储过程,它读取状态为 x 的行的 ID,然后立即将该行 ID 设置为状态 y。
由于多个客户端应用程序正在调用此存储过程,因此以某种方式返回相同的值,而实际上它 2 次执行不应该在状态 x 中找到任何值。
除了在开始事务/提交中包装操作外,我没有使用任何东西。
粗略示例:
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
查询以某种方式从 table 返回了相同的 @resultID
.. 所以我想我需要一些锁定或其他东西来防止这种情况。
是否有一种方法可以确保同时执行存储过程导致先执行一个再执行另一个(顺序)?
谢谢。
简单的答案是加快整个过程 - 如果它是一个缓慢的 运行ning 查询,那么 select 可以 运行 在更新完成之前。
如果您需要 select 某些其他报告的值,您可以有效地 运行 将更新作为第一条语句,并使用 OUTPUT 关键字 return 的 ID更新的记录例如:
UPDATE JOB_QUEUE
SET STATUS_ID = Y WHERE STATUS_ID = X
OUTPUT inserted.ID
我有一个存储过程,它读取状态为 x 的行的 ID,然后立即将该行 ID 设置为状态 y。
由于多个客户端应用程序正在调用此存储过程,因此以某种方式返回相同的值,而实际上它 2 次执行不应该在状态 x 中找到任何值。
除了在开始事务/提交中包装操作外,我没有使用任何东西。
粗略示例:
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
查询以某种方式从 table 返回了相同的 @resultID
.. 所以我想我需要一些锁定或其他东西来防止这种情况。
是否有一种方法可以确保同时执行存储过程导致先执行一个再执行另一个(顺序)?
谢谢。
简单的答案是加快整个过程 - 如果它是一个缓慢的 运行ning 查询,那么 select 可以 运行 在更新完成之前。
如果您需要 select 某些其他报告的值,您可以有效地 运行 将更新作为第一条语句,并使用 OUTPUT 关键字 return 的 ID更新的记录例如:
UPDATE JOB_QUEUE
SET STATUS_ID = Y WHERE STATUS_ID = X
OUTPUT inserted.ID