我正在尝试“原子地”复制一个表到另一个表。基本上,我希望定期更新表,这样,如果另一个进程正在更新表,则从表中读取的进程将不会得到不完整的结果。
为了给出一些背景信息,我想要一个表,作为一个游戏的排行榜。这个排行榜将通过一个单独的过程每隔几分钟更新一次。我的想法是:
表分数包含当用户查看排行榜时将从中读取的可公开查看的排行榜。此表每隔几分钟更新一次。更新排行榜的过程将创建一个包含新排行榜的SCORES_TEMP表。一旦创建了该表,我希望将它的所有内容“原子地”复制到SCORES中。我想我想要做的是:
TRUNCATE TABLE SCORES;
INSERT INTO SCORES SELECT * FROM SCORES_TEMP;我想把所有的分数都换掉。我不需要维护我的主键或自动增量值。我只想把所有来自SCORES_TEMP的数据带进来。但我知道,如果有人在这两个语句完成之前查看分数,排行榜将是空白的。我如何才能做到这一点,使它永远不会显示空白或不完整的数据?谢谢!
发布于 2009-06-01 17:14:43
使用rename table
RENAME TABLE old_table TO backup_table, new_table TO old_table;它是原子的,可以在所有的存储引擎上工作,并且不需要重新构建索引。
发布于 2009-06-01 17:12:20
在MySQL中,由于the behavior of TRUNCATE的原因,我认为您需要:
BEGIN TRANSACTION;
DELETE FROM SCORES;
INSERT INTO SCORES SELECT * FROM SCORES_TEMP;
COMMIT TRANSACTION;我不确定是否有一种方法可以确保DDL操作事务的安全性。
发布于 2009-06-01 17:13:03
您可以使用事务(用于InnoDB),
BEGIN TRANSACTION;
DELETE FROM SCORES;
INSERT INTO SCORES SELECT * FROM SCORES_TEMP;
COMMIT;或LOCK TABLES (用于MyISAM):
LOCK TABLES;
DELETE FROM SCORES;
INSERT INTO SCORES SELECT * FROM SCORES_TEMP;
UNLOCK TABLES;https://stackoverflow.com/questions/935760
复制相似问题