Iは、簡略化のように表すことができるプライオリティキュー・テーブルを有する:priority
プライオリティ(最低最初)であり、status
(0が取得するためにOKを意味する)アイテムの状態であるSQL優先キュー操作 - 落とし穴?
CREATE TABLE test (
id int PRIMARY KEY,
priority int,
status int
)
を。タスクは、最も高い優先順位を持つ要素を取得し、そのステータスをリセットすることで、そのコードは、この(擬似コード)のようになります:
は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;
このコードが実行する必要があります(適宜変更して、異なるLIMIT構文のように)任意のSQLデータベースに(現在の要件はMySQL、Oracle、SQL ServerおよびDB2ですが、それ以上の場合もあります)。私が知る限り、必要なすべてのDBは更新のために "影響を受ける行" APIをサポートしています。このアプローチの潜在的な問題または落とし穴?上記のステートメントでSELECT ... FOR UPDATEを使用する必要がありますか?はいの場合、なぜですか?
トランザクションを使用する予定ですか? –