标签: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. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。