我有一个InnoDB表,需要每10分钟内从60k到200k记录中的任何地方重新填充。我们的方法到现在为止一直如下:MySQL:在事务中截断表?
- 关闭自动提交
- 截断表
- 执行SELECT查询&额外的计算(使用PHP)
- 插入新记录
- 提交
虽然通过截断操作执行后,数据立即删除,并且没有lon ger可从用户界面获得。对我们的用户来说,这非常令人不安,即使在大约30秒左右的时间内,脚本遇到提交操作并且表被重新填充。
我想也许我可以在整个交易中将整个操作包括在内,包括 Truncate,并且这可能会减少表格在用户期间显示为空的时间长度。所以我将“SET AUTOCOMMIT = 0”改为“START TRANSCATION”。
哎呀!这与期望的效果相反!现在TRUNCATE操作仍然发生在脚本的开头,但是在事务内部实际执行INSERT操作需要很长时间,因此在执行COMMIT操作并且表中的数据再次可用时,已经差不多十分钟!
什么可能导致此?实际上,我根本没有期望有任何改变,因为我的印象是,启动交易基本上只会关闭Autocommit?
这是一个非常有趣的想法。我最初的直觉反应是表面感觉有点ha but,但实际上它们有一定的优雅简单性,它可以完美地解决我的问题。希望我自己想到了。 :) – 2011-05-13 01:32:39
已经过去将近一年了,只是想跟进并提到这就是我们最终做的事情,它就像一个魅力。我们创建新表格,插入一大堆记录,并在更新完成后立即将它们交换出去 - 最终用户即时显示。再次感谢。 – 2012-02-22 00:13:59
谢谢你。一直在用最好的方式来进行批量数据更新,而不需要将数据库关闭几秒钟。这是一个很好的解决方法。 – NickH 2013-06-29 18:47:22