我具有可以簡單地表示爲一個優先級隊列表:SQL優先級隊列操作 - 任何陷阱?
CREATE TABLE test (
id int PRIMARY KEY,
priority int,
status int
)
其中priority
爲優先級(第一最低)和status
是物品狀態(0表示行檢索)。任務是檢索具有最高優先級的元素和重置它的狀態,所以代碼是這樣的(僞):
try = 0;
while(try++ < max_tries) {
result = query("SELECT id FROM test WHERE status=0 ORDER BY priority LIMIT 0,1");
if(result not empty) {
/* found a row, try to update */
result2 = query("UPDATE test SET status=1 WHERE id={result[id]} AND status=0");
if(affected_rows(result2) > 0) {
/* if update worked fine, we can use this ID */
return result[id];
}
/* otherwise try again */
}
return NULL;
此代碼應該運行(與適當的修改,就像不同的限制語法)的任何SQL數據庫(目前的需求是Mysql,Oracle,SQL Server和DB2,但可能更多)。據我所知,所有必需的數據庫都支持「受影響的行」API進行更新。這種方法有什麼潛在的問題或陷阱? SELECT ... FOR UPDATE應該在上面的語句中使用,如果是,爲什麼?
您是否打算使用任何交易? – 2012-01-13 00:32:35