Bri*_*acy 33 mysql transactions truncate
我有一个InnoDB表需要每隔十分钟在60k到200k记录的任何地方重新填充.到目前为止,我们的方法如下:
执行截断操作后,数据会立即删除,并且不再可用于用户界面.对于我们的用户来说,这非常令人不安,即使在大约30秒左右的时间内脚本遇到了Commit操作并且表格被重新填充.
我想,也许我可以包住整个操作过程,包括了Truncate在一个事务,这可能削减的时间长度,在此期间表出现空给用户.所以我改变了SET AUTOCOMMIT=0对START TRANSCATION.
哎呀!这与预期的效果相反!现在TRUNCATE操作仍然发生在脚本的开头,但实际执行事务中的操作需要更长INSERT的时间,因此当COMMIT操作发生并且表中的数据再次可用时,它已经接近十分钟!
有什么可能导致这种情况?说实话,我根本没想到会有任何改变,因为我认为启动交易基本上只是关闭Autocommit了?
Rol*_*DBA 58
http://dev.mysql.com/doc/refman/5.1/en/truncate-table.html
根据这个URL,从MySQL 5.1.32开始,TRUNCATE TABLE是DDL而不是DML,如DELETE.这意味着TRUNCATE TABLE将导致COMMIT事务块中间的隐式.因此,DELETE FROM在桌面上使用你需要清空而不是TRUNCATE TABLE.
甚至DELETE FROM tblname;可以回滚.回滚可能需要一段时间,因此请确保InnoDB已正确调整以处理此类回滚可能性的事务时间.
Kib*_*bee 56
实现此目的的更好方法可能是将数据插入到新表中,然后在两个表上使用重命名以交换它们.单个重命名就是交换所需的全部内容,这是一个原子操作,这意味着除了显示的新数据外,用户甚至无法检测到它发生了.然后,您可以截断/删除旧数据.