【问题标题】:SQL stored procedure waiting and executing sequentiallySQL存储过程等待并按顺序执行
【发布时间】: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 的

标签: sql sql-server stored-procedures locking sequential


【解决方案1】:

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

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

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

【讨论】:

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