0

テーブルのレコードを処理する必要がある単純な手順があり、理想的には、同じレコードを処理せずにプロセスの複数のインスタンスを実行します。私が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 で行ロックまたはその他の機能を使用できますか?

4

2 に答える 2

0

行の排他ロックを取得する which を使用するSELECT ... FOR UPDATE NOWAITか、既にロックされている場合はエラーを報告できます。

于 2013-04-11T03:35:13.570 に答える