如何防止存储过程同时两次 运行?
How can I prevent a stored procedure from running twice at the same time?
我正在使用 Aurora 数据库(即 MySQL 版本 5.6.10)作为队列,并且我正在使用存储过程从 table 中批量提取记录。存储过程按照以下步骤工作...
- Select下一批数据变成temptable
- 将临时 table 记录中的 ID 写入日志 table
- 输出记录
一旦一条记录被添加到日志中,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 数据库)就不会受到大量同时精确定时的请求的冲击。
我正在使用 Aurora 数据库(即 MySQL 版本 5.6.10)作为队列,并且我正在使用存储过程从 table 中批量提取记录。存储过程按照以下步骤工作...
- Select下一批数据变成temptable
- 将临时 table 记录中的 ID 写入日志 table
- 输出记录
一旦一条记录被添加到日志中,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 数据库)就不会受到大量同时精确定时的请求的冲击。