MySQL应该没有死锁

时间:2016-09-29 17:01:28

标签: mysql multithreading

我在MySQL InnoDB表中有一个队列,还有10个守护程序进程处理这个队列。 表"队列"有:

  • id(自动增加主键)
  • 守护进程(记录哪个守护进程正在使用该项目的整数)
  • 已处理(tinyint表示处理已完成)
  • 根据需要的其他字段

我的简单方法是,对于每个守护进程,在队列表中保留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'

这怎么可能?

由于每个守护者都保留了它的行,我不会看到任何方式让不同的守护者竞争相同的行,我认为单个守护进程无法自行解锁。

0 个答案:

没有答案