根据CSV,每隔x分钟用PHP更新一整张表


Update a whole table with PHP every x minutes according to a CSV

我必须用PHP每10分钟更新一次MySQL数据库中的大表(产品)。我必须使用cron作业运行PHP脚本,并且我从CSV文件中获得最新的产品。该表目前约有18000行,不幸的是,我不知道它在10分钟内会发生多大变化。最重要的是,我当然不希望用户在后台注意到更新。

这些是我的想法和恐惧:

  • Idea1:我知道有一种方法可以用MySQL将csv文件加载到表中,所以也许我可以使用事务来截断表,并导入csv。但即使我使用事务,只要表很大,我担心一些用户会有一点机会看到空数据库。

  • 理想2:我可以将新旧csv文件与库进行比较,只更新/添加/删除更改的行。通过这种方式,我认为用户不可能看到一个空的数据库,但我担心这种方法会花费大量的RAM和CPU,而且我使用的是共享主机。

因此,基本上我想知道哪种方法最安全,可以在用户没有注意到的情况下完全更新表

假设InnoDB和默认隔离级别,您可以启动事务,删除所有行,插入新行,然后提交。在提交完成之前,用户将看到以前的状态。

当事务打开时(删除后),更新将被阻止,但SELECTs不会。由于它是用户的只读表,因此不会成为问题。在事务打开时,他们仍然可以SELECT

您可以通过阅读MVCC了解详细信息。其要点是,每当有人执行SELECT时,MySQL都会使用数据库中的数据加上回滚段来获取以前的状态,直到事务提交或回滚。

来自MySQL文档:

InnoDB使用回滚段中的信息来执行事务回滚中所需的撤消操作。它还使用用于构建行的早期版本以实现一致读取的信息。

只有在提交完成后,用户才会看到新数据而不是旧数据,并且在当前事务结束之前,他们不会看到新数据。