我在MySQL InnoDB表中有一个队列,还有10个守护程序进程处理这个队列。 表"队列"有:
我的简单方法是,对于每个守护进程,在队列表中保留x行,然后处理它们。
要保留行,我有:
UPDATE queue SET daemon={daemonId} WHERE daemon IS NULL LIMIT {x}
例如:
UPDATE queue SET daemon=3 WHERE daemon IS NULL LIMIT 50
由于并发性,我在这里得到了很多MySQL死锁,但这应该不是问题。如果一个守护进程无法保留行,它将只继续保留任何内容,并在下一个循环迭代中再试一次。
保留后,我会读到行:
SELECT * FROM queue WHERE daemon={daemonId} AND processed=0
例如:
SELECT * FROM queue WHERE daemon=3 AND processed=0
然后我处理每个项目。
处理完一件商品后,我将其标记为已完成:
UPDATE queue SET processed=1 WHERE id={id}
例如:
UPDATE queue SET processed=1 WHERE id=657954
我无法理解的是我在日志中遇到MySQL错误,例如:
Deadlock found when trying to get lock; try restarting transaction UPDATE queue SET processed='1' WHERE id='69215794'
这怎么可能?
由于每个守护者都保留了它的行,我不会看到任何方式让不同的守护者竞争相同的行,我认为单个守护进程无法自行解锁。