我使用Aurora (即MySQL版本5.6.10)作为队列,并使用存储过程以批方式从表中提取记录。sproc可以执行以下步骤..。
一旦记录被添加到日志中,下次调用它时,sproc就不会再次选择它,因此多个服务器可以调用这个sproc,并且两个服务器都可以处理队列中的批数据,而不必彼此踩脚尖。
sproc在一秒钟内运行,但是我的公司现在正在自动旋转服务器,这些克隆的服务器同时在上调用sproc,结果是相同的记录被选中了两次。
有什么办法能让我一次只打一个电话吗?理想情况下,任何额外的调用都应该等到第一个调用完成,然后它们才能运行。
不幸的是,我很少有使用MySQL的经验,所以我不确定从哪里开始。如果有人能给我指明正确的方向,我将不胜感激。
发布于 2021-03-19 17:36:35
这是MySQL表锁定的工作。试试这样的东西。(您没有向我们展示您的查询,所以这里有很多猜测。)
SET autocommit = 0;
LOCK TABLES logtable WRITE;
CREATE TEMPORARY TABLE temptable AS
SELECT whatever FROM whatevertable FOR UPDATE;
INSERT INTO logtable (id)
SELECT id FROM temptable;
COMMIT;
UNLOCK TABLES;如果多个连接尝试并发运行此序列,一个将等待另一个的UNLOCK TABLES;继续运行。你说你的SP是快速的,所以可能没人会注意到短时间的等待。
Pro提示:当您在许多服务器上运行相同的时间代码时,最好在运行作业之前添加一个短的随机延迟。这样,共享资源(如您的MySQL数据库)就不会受到大量请求的锤击,这些请求的时间恰好是同步的。
https://stackoverflow.com/questions/66712743
复制相似问题