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