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

Posted

技术标签:

【中文标题】SQL存储过程等待并按顺序执行【英文标题】:SQL stored procedure waiting and executing sequentially 【发布时间】:2015-11-04 10:24:47 【问题描述】:

我有一个存储过程,它读取状态为 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 

不知何故,查询从表中返回了相同的@resultID .. 所以我想我需要一些锁定或其他东西来防止这种情况发生。

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

谢谢。

【问题讨论】:

标记使用的 dbms 产品。 (看起来不像 ANSI SQL...) 这适用于哪个 RDBMS?请添加标签以指定您使用的是mysqlpostgresqlsql-serveroracle 还是db2 - 或其他完全不同的东西。 您好,这是用于 sql server 的 【参考方案1】:

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

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

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

【讨论】:

我需要根据参数检索一个 id(更改 where 子句),然后更新该记录 id,并返回整行。 我认为你是对的,选择似乎是在更新之前执行的......这就是为什么我希望在存储过程中保留所有其他命中,直到一次执行完成。

以上是关于SQL存储过程等待并按顺序执行的主要内容,如果未能解决你的问题,请参考以下文章

执行sql脚本,不等待完成

SQL Server 2008 R2执行存储过程sp_MailItemResultSets引起大量PREEMPTIVE_OS_WAITFORSINGLEOBJEC等待

SQL Server 存储过程:等待删除触发器完成,然后再继续该过程

Oracle执行超长SQL的存储过程问题

等待存储过程等待其他存储过程执行

使用命令将存储过程查询从 sql 文件导入 Oracle DB