簡體   English   中英

SQL從表中選擇行並更新相同的行

[英]SQL Select Rows from a table and update the same rows

我想要 :

  1. 從表中選擇N行進行處理,其中flag = 0
  2. 使用這N行中的值在第二張表上做一些工作
  3. 更新這N行並設置flag = 1

我有並行的進程一起完成相同的工作,並且我想確保所有進程都可以在唯一的行上工作。 我如何確保?

我假設您正在SQL Server上運行(由於有標簽),否則,我的答案將不適用。 僅僅鎖定是不夠的。 如果使用數據庫記錄鎖定,則SqL服務器將阻止其他嘗試訪問鎖定行的進程,實際上,您一次只能處理一行。 您的解決方案是將行鎖定與READPAST提示結合使用,以便跳過其他人鎖定的行。 以下是每個過程應執行的操作:

  1. 選擇下一個未鎖定的行進行處理並將其鎖定
  2. 做工作
  3. 更新行和結束交易

select top 1 id, ... from TheTable with (updlock, readpast) where flag = 0

//do the work now

update TheTable set flag = 1 where id=<previously retrieved id>

這樣做的好處是,選擇下一個未鎖定的行並將其鎖定的操作是原子的,因此可以確保其他任何人都無法選擇同一行。

一種方法是讓主程序將段分發給子線程。

另一種方法是鎖定表,獲取CEIL(N/#processes)行,其中flag = 0,將標志更新為2,然后釋放鎖。 然后,下一個進程將繼續執行,因為它已獲得鎖定,並且由於flag = 2,因此不會獲得這些行。

您有兩種鎖定表的方法-您可以鎖定整個對象,也可以執行SELECT ... FOR UPDATE(有限制)(以免獲得太多行)。 請參閱: 使用SQL Server選擇更新

將標志設置為process_id甚至比將標志設置為2更好。 然后,您要做的就是更新所有行以分配數字,然后讓該過程開始工作,每個進程僅檢查自己的行。

暫無
暫無

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

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