mysql - 阻止对给定外键的查询,直到该外键的所有插入完成

标签 mysql insert locking foreign-keys

我有两个工作人员在一个相对较大(大约 6000 万行)的 MySQL 表上执行并发插入/选择操作。

  1. 工作线程 1 插入一个新行并将包含新行外键的消息放入队列。对于给定的外键值,这种情况大约每天发生一次。
  2. 工作线程 2 将消息出列,查询表中外键的最新记录并进一步处理。

看起来,Worker 2 通常无法从表中获取最新记录。有没有办法阻止 Worker 2 对给定外键的查询,直到该外键的插入完成为止?

提前致谢

最佳答案

我可能缺少一些关键信息来准确回答,但是......

...我的猜测是,“消息”在一个事务中对数据库所做的更改对另一个事务可见之前到达。

请记住,根据您的事务隔离级别 (1),在您成功提交事务之前,更改不会传播到数据库。 (2) 在启动事务之前,数据库的新状态不可见。

即便如此,据我所知,MySQL 也不保证任何“传播延迟”。而且我认为 MySQL 中没有任何可用的机制来向其他连接发出信号,而不是事务已成功提交并且更改现在可见。

<小时/>

我不了解你的系统,但作为一个建议,我不认为使用消息队列来发出更改信号但是使用MySQL来存储实际的更改数据是一个很好的选择解决方案。如果我是你,我会考虑一个合适的消息系统,例如 RabbitMQ ,这不仅允许发出变化信号,而且还将携带新状态——几乎(如果不是全部的话)与 RDBMS 具有相同的保证。也许您可以重构您的应用程序,以便使用消息队列处理更改,并且只有完成后,才使用 MySQL 永久存储数据。

关于mysql - 阻止对给定外键的查询,直到该外键的所有插入完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18175898/

相关文章:

mysql - 是否有单独的语言来查询 SQL Server 和 Oracle

存储函数中的MySQL if语句序列

c++ - 在 C++ 中的自定义字符串类中实现插入?

c# - 简单的线程问题,锁定对共享资源或整个功能的访问?

c++ - 使用 std::try_to_lock 的意外行为

mysql - 从 node.js 在 redis 中查询

php - 库存管理软件 - php MySQL

与 MYISAM 相比,在插入期间使用 InnoDB 的 mysql 速度较慢

mysql - SQL语句插入重复数据

java - 如何正确同步/锁定变量?