数据库
首页 > 数据库> > 如果在TRUNCATE和SELECT INTO之间发送查询,则没有数据.使用MySQL innoDB

如果在TRUNCATE和SELECT INTO之间发送查询,则没有数据.使用MySQL innoDB

作者:互联网

使用MySQL DB,我在创建的存储过程和事件计时器上遇到了麻烦.
我制作了一个空表,该表通过SELECT INTO填充了另一个表中的数据.
在填充之前,我会截断当前数据.它仅用于跟踪自当前日期起2个月内发生的日志条目.

这将一个350k的日志表变成大约750个,这确实加快了报告查询的速度.

问题在于,如果客户端恰好在TRUNCATE语句和SELECT INTO语句之间发送查询(考虑到将EVENT设置为每1分钟运行一次,则该可能性很高),查询将不返回任何行.

运行此过程时,我已经研究过锁定表上的读取,但是在存储过程中不允许进行锁定.

任何人都可以提出一种(最好)不需要重新设计的解决方法吗?
我确实需要在这里指出正确的方向.

谢谢,
马克斯

解决方法:

我建议一种替代方法,而不是截断表格,然后选择表格…

您可以改为将新数据集选择到新表中.接下来,使用单个RENAME命令,将新表重命名为现有表,并将现有表重命名为某些备份名称.

RENAME TABLE existing_table TO backup_table, new_table TO existing_table;

这是一个单一的原子操作…因此,客户端在清空数据之后但在重新填充数据之前,不可能从数据中读取数据.

或者,您可以将TRUNCATE更改为DELETE FROM,然后将其与SELECT INTO一起包装在事务中:

START TRANSACTION
    DELETE FROM YourTable;
    SELECT INTO YourTable...;
COMMIT

标签:locking,innodb,truncate,mysql,stored-procedures
来源: https://codeday.me/bug/20191201/2081710.html