2015-11-04 76 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

我認爲你是正確的,但選擇似乎在更新之前執行..這就是爲什麼我希望在存儲過程中保持所有其他命中,直到一次執行完成。 –