当用户发出请求(REST API)时,我想将N
条记录从表source
复制到表destination
。
destination
。destination
中,从source
LIMIT N
中进行选择(单个查询)。 N
可以在100000
-2500000
范围之间,如果用户使用N
记录一个接一个地发出两个请求,则2xN
个记录是被插入。
示例流程:
100
个记录。200
个记录。destination
。destination
。100
条记录)200
条记录)结果:300
表中有destination
条记录。
我想确保在任何给定的时间点仅发生一次插入。
destination
表。destination
表。destination
表中。destination
表。请注意,当我只想只写锁定目标表时,不应进行写操作(但仍应进行读操作)。
暂时,我们取决于在开始事务之前在数据库中设置的标志,然后在事务完成后将其取消设置。设置了标记后到达的其他任何请求都将以一条消息终止(进程已在运行,请稍后重试)
请帮助我为此找到更好的解决方案。让我知道您是否需要更多详细信息。
谢谢
答案 0 :(得分:0)
您能退后一步,解释一下目标是什么吗?同时,这是另一个可能有用的实现:
CREATE TABLE new LIKE dest;
populate `new` from `source;
RENAME TABLE dest TO old, new TO dest;
DROP TABLE old;
注意:
dest
可能会花费很长时间而没有任何锁定问题。dest
始终可用,除了RENAME
期间的短暂时间之外,在此期间dest
上的活动被阻止。这是一种原子化的通用方法,并且在影响最小的情况下重新加载表。
答案 1 :(得分:0)
您可以尝试以下查询,如下所示...
SET AUTOCOMMIT=0;
LOCK TABLES `staff` WRITE;
-- inserts start here
INSERT INTO `staff` VALUES
(2,'Jon','Snow',4,NULL,'Jon.snow@gameofthroneshbo.com',2,1,'Jon',NULL,'2006-02-15 03:57:16'),
(2,'Jon','Stephens',4,NULL,'Jon.Stephens@sakilastaff.com',2,1,'Jon',NULL,'2006-02-15 03:57:16');
-- till here
UNLOCK TABLES;
COMMIT;
答案 2 :(得分:0)
如何优化SQL查询以在插入记录时执行Lock-Unlock方案:
LOCK TABLES
tbl_name [[AS] alias] lock_type
[, tbl_name [[AS] alias] lock_type] ...
lock_type:
READ [LOCAL]
| [LOW_PRIORITY] WRITE
UNLOCK TABLES
更多信息-https://dev.mysql.com/doc/refman/8.0/en/lock-tables.html