2013-09-27 33 views
2

我想編寫一個查詢,它只更新表中的一行,然後返回更新的行。如何正確更新一條記錄並在單個db2查詢中選擇更新的行

我可以得到實現使用

select field from final table 
(update tablename set anotherfield = 'dd' where someanotherfield = 'bb') 

一種說法返回的行。但我不能只更新一行。

另外我的程序調用這個查詢是一個多線程的,我不想死鎖任何進程,所以,我發現SKIP LOCKED DATA語句就像t-sql查詢中的readpast。

所以我想要做的是,我的程序使用一個像堆棧一樣的db2表,每次只選擇一行,更新它使其他線程無法訪問它但不會讓它們等待整個表,它們只需跳過更新的行並從表中選擇下一條記錄。此操作是否可以在單個db2查詢中執行?

我至今寫了這個查詢,它不能處理

select COLUMN3 FROM FINAL TABLE 
    ( 
     update MYTABLE 
     set COLUMN1 = 'R' 
     where COLUMN1 = '' 
      order by COLUMN2 
      FETCH FIRST 1 ROW ONLY 
      SKIP LOCKED DATA 
    ) 

任何幫助,將不勝感激,謝謝 。

+0

#winces#SQL被_defined_在** sets **中效果最好,這意味着它在嘗試更新儘可能多的行時效果最佳。你想在這裏完成什麼?請注意,如果您試圖獲得某種消息隊列,那麼數據庫實際上將成爲速度的瓶頸;你最好用一個實際的'消息隊列'類型的程序(其中許多具有彈性功能,在多線程之上)...... –

回答

1

假設COLUMN2是UNIQUE_ID,你可以做這樣的事情:

select COLUMN3 FROM FINAL TABLE 
( 
    update MYTABLE 
    set COLUMN1 = 'R' 
    where COLUMN1 = '' 
     AND COLUMN2 = (SELECT COLUMN2 
         FROM MYTABLE 
         ORDER by COLUMN2 
         FETCH FIRST 1 ROW ONLY) 
    SKIP LOCKED DATA 

) 

你被你的更新裏面做一個訂單,那是行不通的。您必須將其限制爲只有一個結果(可能使用您的主鍵)。

+0

但我不想更新每一行,因爲標題說一個人想要逐一更新行。 – user2825077

+0

的確如此。我以錯誤的方式看待它。我編輯了我的答案。 –

+0

好的,它的工作原理。但我想問一個問題。它避免了死鎖嗎?獲取主鍵的內部子查詢使得提交的讀取,對嗎?如果我在多線程程序中使用該查詢,我想每個線程都會等待另一個進程從表中獲取主鍵元素。我對嗎?你有什麼意見? – user2825077

相關問題