【问题标题】:Producer/consumer table in mysql - missing rowsmysql中的生产者/消费者表 - 缺少行
【发布时间】:2014-03-23 16:20:42
【问题描述】:

我有一个 mysql 表被用作消息队列:

id | message_text

这是一个 InnoDB 表,id 字段是一个自增整数字段。

生产者应用有多个线程,它们执行如下插入操作:

insert into my_table(message_text) values('the text');

消费者应用每五秒运行一次。它选择 50 条记录,然后按行 ID 删除每条记录:

rows = select * from my_table limit 50;
for (row : rows) {
    delete from my_table where id = row.id;
}

消费者应用似乎没有看到所有行。只有一个生产者应用程序实例在运行,它在单个线程中进行选择。生产者应用程序打印以控制台它插入的所有消息,消费者应用程序还打印它处理的每一行,但它缺少行。

我认为既然我是按行 ID 明确删除的,我不会遇到问题,但似乎我肯定会在某处删除行。

谢谢

【问题讨论】:

  • 生产者创建消息的速度有多快?不会是消费者根本赶不上吗?
  • 一点也不快,比如每秒 1 个。
  • 好吧,如果你只删除“已经看到”的行的 id,那么消费者应该在下一次运行中看到它们……除非它们“从未见过”,因为有太多.您只是选择没有应用任何ORDER BY 的行吗?这会让消费者看到whatwhen非常随机……所以我建议包括订购,看看你会得到什么结果。
  • 是的,这是我的想法,它们最终应该被消费者看到。但我关闭了生产者,让消费者继续前进。消费者不知何故从未看到某些行。如果这在理论上可行,那么我一定是在某个地方引入了问题。
  • 如果没有顺序,我相信它们会按主键的顺序出现,我猜这甚至是预期的行为。但是添加订单肯定不会受到伤害

标签: mysql database


【解决方案1】:

啊,这只是我的一个愚蠢的错误。我的初始代码测试(在 jdbc 中)在其中一个线程中自动提交关闭,我没有明确提交。这导致我认为有些行被丢弃了。

我可以确认此模式现在按预期工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多