我必须使用PHP每10分钟更新一次MySQL数据库中的大表(产品)。我必须使用cron作业运行PHP脚本,并从CSV文件中获取最新的产品。该表目前有大约18000行,不幸的是我不知道它会在10分钟内变化多少。最重要的当然是我不希望用户在后台注意到更新。
这些是我的想法和恐惧:
Idea1:我知道有一种方法可以load a csv file into a table使用MySQL,所以也许我可以使用事务截断表,然后导入CSV。但即使我使用交易,只要表格很大,我担心某些用户看到空数据库的可能性很小。
Idea2:我可以比较旧的和新的csv文件with a library,只更新/添加/删除更改的行。这种方式我认为用户不可能看到一个空的数据库,但我担心这种方法会耗费大量的RAM和CPU,而且我在共享主机上。
所以基本上我想知道哪种方法最安全地更新表而没有用户注意到它。
答案 0 :(得分:3)
假设InnoDB和默认隔离级别,您可以启动事务,删除所有行,插入新行,然后提交。在提交完成之前,用户将看到之前的状态。
当事务处于打开状态(删除之后)时,更新将被阻止,但SELECT不会。由于它是用户的只读表,因此不会出现问题。在交易开放时,他们仍然可以SELECT
。
您可以阅读MVCC了解详细信息。它的要点是,只要有人执行SELECT
,MySQL就会使用数据库中的数据和回滚段来获取先前的状态,直到提交或回滚事务为止。
来自MySQL docs:
InnoDB使用回滚段中的信息来执行 撤消事务回滚中所需的操作。它也使用了 用于构建行的早期版本以获得一致读取的信息。
只有在提交完成后,用户才会看到新数据而不是旧数据,并且在当前事务结束之前,他们不会看到新数据。