2013-02-06 45 views
2

我有一張表,用於存儲需要每隔幾個小時批量發送的信息。此表中的每一行對應於我需要批量處理的一個項目。每隔幾個小時,我會查詢所有新行where the state = 'New'是更新,然後選擇更有效的獲取表中的新行?

當我開始批處理這些行時,我想將行的狀態設置爲'批處理',並且一旦我完成了批處理,我想將狀態設置爲'完成'。

將按以下SQL更高效:

UPDATE BatchTable SET state = <random number> where state = 'New'; 
    SELECT * from BatchTable where state = <random number>; 

通過做UPDATE第一,它會避免兩個線程做一個選擇,然後可能要處理,而另一個線程正在做被封鎖的局面批處理/更新行?如果我做了UPDATE,它是否會避免被其他線程阻塞?

有沒有完全不同的,更好的方法來做到這一點?

+0

您正在使用哪種RDBMS?當插入新記錄時,你不能使用觸發器將記錄放入'BatchTable'中嗎? – Yuck

+0

這個設計是有缺陷的,因爲一個記錄可能是「New」,然後在輪詢數據以將其包含在「BatchTable」中之前更改爲另一個「state」。 – Yuck

+0

考慮使用「select for update」,這裏是mySql和Oracle的參考: http://dev.mysql.com/doc/refman/5.0/en/innodb-locking-reads.html http:// stackoverflow.com/questions/5847228/oracle-select-for-update-behaviour – Osy

回答

1

我看到你的擔心:當select語句正在執行時,可能會添加新行,但會被更新捕獲,但不會被select。所以...你的方法是最簡單的方法,通過在測試中引入第三個值。你可以玩的另一件事,我的歉意,因爲我沒有使用它很多是:OUTPUT子句:http://msdn.microsoft.com/en-us/library/ms177564.aspx。這將允許您從select語句執行更新並獲取值,我相信所有這些都在一個語句中。