mysql - 如何以原子方式将行从一个表移动到另一个表?

标签 mysql sql atomic

我正在收集来自数千个传感器的读数并将它们存储在 MySQL 数据库中。每秒有数百次插入。为了提高插入性能,我最初将值存储到 MEMORY 缓冲表中。我每分钟运行一次存储过程,将插入的行从内存缓冲区移动到永久表。

基本上我想在我的存储过程中执行以下操作以从临时缓冲区移动行:

INSERT INTO data SELECT * FROM data_buffer;
DELETE FROM data_buffer;

不幸的是,前一个不可用,因为数据收集过程在上面的 INSERT 和 DELETE 之间的“data_buffer”中插入了额外的行。因此,这些行将被删除而不会插入到“数据”表中。

如何使操作成为原子操作或使 DELETE 语句只删除在前面的语句中被选择和插入的行?

如果可能的话,我更愿意以一种适用于不同数据库引擎的标准方式来执行此操作。

由于性能开销和存储要求,我不希望添加任何额外的“id”列。

我希望在标准 SQL 或类似的东西中有 SELECT_AND_DELETE 或 MOVE 语句...

最佳答案

我相信这会起作用,但会阻塞直到插入完成

SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
BEGIN TRANSACTION;
INSERT INTO data (SELECT * FROM data_buffer FOR UPDATE); 
DELETE FROM data_buffer; 
COMMIT TRANSACTION;

关于mysql - 如何以原子方式将行从一个表移动到另一个表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6925739/

相关文章:

php - MySQL 无法在 Windows 8.1 的 Xampp 控制面板中启动

php - WHILE 循环 SELECT 查询中每个结果的变量

mysql - 如何在 1 个变量 sql 中存储多个行集

c# - 如何将两个序列合并为一个?

c++ - std::atomic 如何保证原子性

c++ - 发生在同一线程中的关系之前

MySQL:基于两列内连接进行更新

php - CONCAT_GROUP() 的方法

mysql - 合并两个选择查询。让它们独一无二

java - 原子 boolean 值,测试当前值