我有一個簡單的過程,我需要處理表的記錄,理想情況下運行多個進程的實例,而不處理相同的記錄。我已經與MySQL這樣做的方式是相當普遍的(雖然我認爲令牌場更加黑客攻擊的):PostgreSQL表上並行進程
添加幾個字段的表:
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可以被認爲比MySQL更成熟,關於MVCC鎖定問題 - 我可以在Pg中使用行鎖定還是其他功能,而不是令牌字段?
是的,這種方法總是覺得像用錘子敲釘子 - 我一直想看看ZeroMQ很長一段時間,所以我會走這條路。感謝您的洞察! – Ross 2013-04-11 20:08:57