テーブルのレコードを処理する必要がある単純な手順があり、理想的には、同じレコードを処理せずにプロセスの複数のインスタンスを実行します。私がMySQLでこれを行った方法はかなり一般的です(トークンフィールドはハックのように見えますが):
テーブルにいくつかのフィールドを追加します。
CREATE TABLE records (
id INTEGER PRIMARY KEY AUTO_INCREMENT,
...actual fields...
processed_at DATETIME DEFAULT NULL,
process_token TEXT DEFAULT NULL
);
そして、簡単な処理スクリプト:
process_salt = md5(rand()) # or something like a process id
def get_record():
token = md5(microtime + process_salt)
db.exec("UPDATE records SET process_token = ?
WHERE processed_at IS NULL LIMIT 1", token)
return db.exec("SELECT * FROM records WHERE token = ?", token)
while (row = get_record()) is valid:
# ...do processing on row...
db.exec("UPDATE records SET processed_at = NOW(), token = NULL
WHERE id = ?", row.id)
PostgreSQL データベースを使用するシステムでこのようなプロセスを実装しています。Pg は MVCC のおかげでロックに関して MySQL よりも成熟していると考えられることを私は知っています -トークン フィールドの代わりに Pg で行ロックまたはその他の機能を使用できますか?