SQL存储过程按顺序等待和执行
我有一个存储过程,它读取状态为x的行的ID,然后立即将该行ID设置为状态y 由于多个客户端应用程序正在调用此存储过程,因此以某种方式返回相同的值,而实际上,it 2执行在状态x中应该找不到任何值 除了在begin transaction/commit中包装操作之外,我没有使用其他任何东西 粗略的例子: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_
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似乎是在更新完成之前执行的。。这就是为什么我希望保留存储过程中的所有其他命中,直到一次执行完成。