ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

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

2019-12-01 15:28:01  阅读:640  来源: 互联网

标签:locking innodb truncate mysql stored-procedures


使用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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有