2015-11-04 75 views
0

我有一个存储过程,它读取状态为x的行的ID,然后立即将该行ID设置为状态y。SQL存储过程按顺序等待并执行

由于这个存储过程被多个客户端应用程序调用,不知怎的,相同的值被返回,而实际上它的执行不应该在状态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 

不知该查询返回相同@resultID从表..所以我假定我需要一些锁定或东西,以防止这一点。

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

谢谢。

+1

标签DBMS使用的产品。 (看起来不像ANSI SQL ......) – jarlh

+0

这是RDBMS的用途吗?请添加一个标签来指定您是使用'mysql','postgresql','sql-server','oracle'还是'db2' - 或者其他的东西。 –

+0

您好,这是为SQL服务器 –

回答

0

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

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

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

我需要检索基于参数的id(更改where子句),然后更新该记录ID,并返回整个行。 –

+0

我认为你是正确的,但选择似乎在更新之前执行..这就是为什么我希望在存储过程中保持所有其他命中,直到一次执行完成。 –