对于网络爬虫,我正在将一个带有 INSERT INTO 表的进程运行到一个 2GB(2000 万行)的巨大表中。有时,长时间运行的第二个进程“SELECT * from table”查询会导出所有行(并转换数据)。当 SELECT * 运行时,该表当然被锁定以进行写入。所以 INSERT INTO 查询会抛出异常。我在第一个过程中捕获异常并每分钟重试一次,直到它起作用。
奇怪的是,在异常被捕获并且理论上 INSERT 可以通过之后,插入总是失败并出现错误“sqlite3.IntegrityError:PRIMARY KEY must be unique”。当我检查表格时,我确信没有一个主键是重复的。该行实际上根本没有添加。当我重新尝试手动插入行时,它可以工作。
我怀疑正在进行一些与异常有关的回滚。我不知道该怎么做(没有创建一个信号文件来告诉第一个进程不要接触数据库)。有任何想法吗?
或者更好的是,关于如何正确解决一般问题的任何其他想法:一个进程写入一个表,第二个进程不时需要完整的表?
这是在带有 python 2.7 的 sqlite 3.5.9 中。(由于增加了依赖,我不希望升级 sqlite。)