我有一張表,用於存儲需要每隔幾個小時批量發送的信息。此表中的每一行對應於我需要批量處理的一個項目。每隔幾個小時,我會查詢所有新行where the state = 'New'
。是更新,然後選擇更有效的獲取表中的新行?
當我開始批處理這些行時,我想將行的狀態設置爲'批處理',並且一旦我完成了批處理,我想將狀態設置爲'完成'。
將按以下SQL更高效:
UPDATE BatchTable SET state = <random number> where state = 'New';
SELECT * from BatchTable where state = <random number>;
通過做UPDATE
第一,它會避免兩個線程做一個選擇,然後可能要處理,而另一個線程正在做被封鎖的局面批處理/更新行?如果我做了UPDATE
,它是否會避免被其他線程阻塞?
有沒有完全不同的,更好的方法來做到這一點?
您正在使用哪種RDBMS?當插入新記錄時,你不能使用觸發器將記錄放入'BatchTable'中嗎? – Yuck
這個設計是有缺陷的,因爲一個記錄可能是「New」,然後在輪詢數據以將其包含在「BatchTable」中之前更改爲另一個「state」。 – Yuck
考慮使用「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