首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何防止存储过程同时运行两次?

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

Stack Overflow用户
提问于 2021-03-19 17:17:32
回答 1查看 383关注 0票数 1

我使用Aurora (即MySQL版本5.6.10)作为队列,并使用存储过程以批方式从表中提取记录。sproc可以执行以下步骤..。

  1. 将下一批数据选择到一个temptable中。
  2. 将从temp表中的记录中的ID写入日志表。
  3. 输出记录

一旦记录被添加到日志中,下次调用它时,sproc就不会再次选择它,因此多个服务器可以调用这个sproc,并且两个服务器都可以处理队列中的批数据,而不必彼此踩脚尖。

sproc在一秒钟内运行,但是我的公司现在正在自动旋转服务器,这些克隆的服务器同时在上调用sproc,结果是相同的记录被选中了两次。

有什么办法能让我一次只打一个电话吗?理想情况下,任何额外的调用都应该等到第一个调用完成,然后它们才能运行。

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-03-19 17:36:35

这是MySQL表锁定的工作。试试这样的东西。(您没有向我们展示您的查询,所以这里有很多猜测。)

代码语言:javascript
复制
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数据库)就不会受到大量请求的锤击,这些请求的时间恰好是同步的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66712743

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档