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?请添加标签以指定您使用的是mysql
、postgresql
、sql-server
、oracle
还是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 Server 2008 R2执行存储过程sp_MailItemResultSets引起大量PREEMPTIVE_OS_WAITFORSINGLEOBJEC等待