如何防止存储过程同时两次 运行?

How can I prevent a stored procedure from running twice at the same time?

我正在使用 Aurora 数据库(即 MySQL 版本 5.6.10)作为队列,并且我正在使用存储过程从 table 中批量提取记录。存储过程按照以下步骤工作...

  1. Select下一批数据变成temptable
  2. 将临时 table 记录中的 ID 写入日志 table
  3. 输出记录

一旦一条记录被添加到日志中,sproc 将不会在下次调用时再次 select 它,因此多个服务器可以调用此 sproc,并且都处理来自队列的批量数据没有踩到对方的脚趾。

存储过程 运行 在几分之一秒内完成,但我的公司现在正在自动启动服务器,这些克隆的服务器正在 准确地 调用存储过程同时,结果是相同的记录被select编辑了两次

有没有办法让这个存储过程一次只能调用一个?理想情况下,任何其他调用都应等到第一个调用完成,然后它们可以 运行

不幸的是,我使用 MySQL 的经验很少,所以我不确定从哪里开始。如果有人能指出正确的方向,我将不胜感激

这是 MySQL table locking 的工作。尝试这样的事情。 (您没有向我们展示您的查询,所以这里有很多猜测。)

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 很快,所以可能没有人会注意到短暂的等待。

专业提示:当您在很多服务器上使用相同的定时代码 运行ning 时,最好在 运行宁工作。这样一来,共享资源(比如您的 MySQL 数据库)就不会受到大量同时精确定时的请求的冲击。