PHP反复更新并插入Innodb,更新未找到正确的记录

时间:2015-06-22 14:41:18

标签: php mysql innodb

我在运行CentOS 6.6 x64和PHP 5.5的InnoDB插件版本5.5上使用MySQL。隔离级别设置为REPEATABLE-READ。

我在一张桌子上摄取了大约40,000条记录。如果我只导入大约500条记录,一切正常。

其中一些记录可能具有重叠的日期时间范围。如果他们这样做,那么在PHP中进行了几个步骤。

要检查重叠记录,请完成SELECT,如果返回空,我只需插入新记录即可。如果返回了记录,则会执行以下步骤。

  1. 使两个重叠记录(记录A)中较旧的记录无效
  2. 将旧记录的非重叠部分复制到新记录(记录C)并插入该记录
  3. 插入两个重叠记录中的较新记录(记录B)
  4. 当我为40,000记录案例运行摄取时,我可以看到重叠的日期范围,这意味着select查询没有返回任何内容,然后导致特殊重叠处理不会触发。同样,在较小的摄取情况下,所有这些逻辑工作正常,我在两种情况下都查看了相同的特定重叠日期范围。

    此时,在我看来,当下一次选择重叠检查发生时,在下一个逻辑循环中没有看到插入提交。

    我开始研究具有表锁定,事务和隔离级别的选项,但我不确定最佳方法是什么。

1 个答案:

答案 0 :(得分:0)

# For each of the 40K rows:
BEGIN;
SELECT ... FOR UPDATE;
check for overlap (etc) and adjust accordingly
COMMIT;

需要很多分钟;那可以吗?

可以在多个线程中完成 - 这将加快总的摄取时间。