我有一个简单的过程,我需要处理表的记录,并且理想情况下运行该过程的多个实例而不处理相同的记录。我使用 MySQL 完成此操作的方式相当普遍(尽管我认为 token 字段更像是一种 hack):
向表中添加几个字段:
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 中使用行锁定或其他一些功能来代替令牌字段吗?