SQL存储过程按顺序等待和执行

SQL存储过程按顺序等待和执行,sql,sql-server,stored-procedures,locking,sequential,Sql,Sql Server,Stored Procedures,Locking,Sequential,我有一个存储过程,它读取状态为x的行的ID,然后立即将该行ID设置为状态y 由于多个客户端应用程序正在调用此存储过程,因此以某种方式返回相同的值,而实际上,it 2执行在状态x中应该找不到任何值 除了在begin transaction/commit中包装操作之外,我没有使用其他任何东西 粗略的例子: Begin Transaction IF (@Param = '2') -- all BEGIN @resultID = (SELECT ... WHERE STATUS_

我有一个存储过程,它读取状态为x的行的ID,然后立即将该行ID设置为状态y

由于多个客户端应用程序正在调用此存储过程,因此以某种方式返回相同的值,而实际上,it 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
。。所以我想我需要一些锁或者什么东西来防止这种情况

是否有一种方法可以确保存储过程的执行同时导致一个执行,然后是另一个(按顺序)执行


谢谢。

简单的答案是加快整个过程——如果是运行缓慢的查询,那么select可以在更新完成之前运行

如果需要为其他报表选择值,可以有效地将update作为第一条语句运行,并使用OUTPUT关键字返回更新记录的ID,例如:

UPDATE JOB_QUEUE
SET STATUS_ID = Y WHERE STATUS_ID = X
OUTPUT inserted.ID

标记所使用的dbms产品。(看起来不像ANSI SQL…)这是用于哪个RDBMS的?请添加一个标记,以指定您使用的是
mysql
postgresql
sql server
oracle
db2
-还是其他完全相同的东西。您好,这是针对sql server的。我需要根据参数检索id(更改where子句),然后更新该记录id,并返回整行。我认为您是对的,select似乎是在更新完成之前执行的。。这就是为什么我希望保留存储过程中的所有其他命中,直到一次执行完成。