我有两个工作人员在一个相对较大(大约 6000 万行)的 MySQL 表上执行并发插入/选择操作。
- 工作线程 1 插入一个新行并将包含新行外键的消息放入队列。对于给定的外键值,这种情况大约每天发生一次。
- 工作线程 2 将消息出列,查询表中外键的最新记录并进一步处理。
看起来,Worker 2 通常无法从表中获取最新记录。有没有办法阻止 Worker 2 对给定外键的查询,直到该外键的插入完成为止?
提前致谢
最佳答案
我可能缺少一些关键信息来准确回答,但是......
...我的猜测是,“消息”在一个事务中对数据库所做的更改对另一个事务可见之前到达。
请记住,根据您的事务隔离级别 (1),在您成功提交事务之前,更改不会传播到数据库。 (2) 在启动新事务之前,数据库的新状态不可见。
即便如此,据我所知,MySQL 也不保证任何“传播延迟”。而且我认为 MySQL 中没有任何可用的机制来向其他连接发出信号,而不是事务已成功提交并且更改现在可见。
<小时/>我不了解你的系统,但作为一个建议,我不认为使用消息队列来发出更改信号但是使用MySQL来存储实际的更改数据是一个很好的选择解决方案。如果我是你,我会考虑一个合适的消息系统,例如 RabbitMQ ,这不仅允许发出变化信号,而且还将携带新状态——几乎(如果不是全部的话)与 RDBMS 具有相同的保证。也许您可以重构您的应用程序,以便使用消息队列处理更改,并且只有完成后,才使用 MySQL 永久存储数据。
关于mysql - 阻止对给定外键的查询,直到该外键的所有插入完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18175898/