簡體   English   中英

如何鎖定正在執行的存儲過程並更改該存儲過程返回的表?

[英]How would I lock a stored procedure that is executing and alter the table that the stored procedure returns?

我有一張桌子,如下所示:

id    status
--    ------
1     pass
1     fail
1     pass
1     na
1     na

另外,我有一個存儲過程,該過程返回一個表,其中前100條記錄的狀態為“ na”。 該存儲過程可由環境中的多個節點調用,我不希望它們獲取重復的數據。 因此,我想在執行過程中鎖定存儲過程,並將從存儲過程中獲取的記錄的狀態設置為“進行中”,然后返回該表,然后釋放該鎖,以使不同的節點不會獲取相同的內容數據。 我將如何完成?

您可以將select與WITH (SERIALIZABLE)隔離級別一起WITH (SERIALIZABLE) ,以確保記錄被鎖定,直到狀態更新為止,如下所示。

SELECT TOP 100 id 
INTO   #temp 
FROM   [your_table] WITH (serializable) 
WHERE  status = 'na' 

UPDATE ut 
SET    status = 'In Progress' 
FROM   [your_table] ut WITH (serializable) 
       INNER JOIN #temp T 
               ON T.id = ut.id 

SERIALIZABLE隔離級別指定以下內容:

  • 語句無法讀取已被其他事務修改但尚未提交的數據。
  • 在當前事務完成之前,沒有其他事務可以修改當前事務已讀取的數據。
  • 在當前事務完成之前,其他事務不能插入鍵值將落入當前事務中任何語句讀取的鍵范圍內的新行。

來源(MSDN)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM