【发布时间】: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 的
标签: sql sql-server stored-procedures locking sequential