并发SELECT查询时,SQLite“PRIMARY KEY必须是唯一的”

时间:2012-11-18 00:43:06

标签: sqlite

对于网络爬虫,我正在使用INSERT INTO表运行一个进程到一个2GB(2000万行)的巨大表中。有时,长时间运行的第二个进程“SELECT * from table”查询导出所有行(并转换数据)。当SELECT *运行时,该表当然被锁定以进行写入。因此INSERT INTO查询将抛出异常。我在第一个过程中捕获异常并每分钟重试一次,直到它起作用。

然后奇怪的是,在捕获到异常并且INSERT理论上可以通过之后,插入总是失败并出现错误“sqlite3.IntegrityError:PRIMARY KEY必须是唯一的”。当我检查表时,我确信没有任何主键是重复的。实际上没有添加该行。当我重试手动插入行时,它可以正常工作。

我怀疑是否会发生一些与异常有关的回滚。我不知道该怎么做(没有创建一个信号文件来告诉第一个进程不要触摸数据库)。有什么想法吗?

或者更好,关于如何正确解决一般问题的任何其他想法:一个进程写入表,第二个进程需要不时的全表?

这是在sqlite 3.5.9中使用python 2.7。 (由于添加的依赖性,我宁愿不升级sqlite。)

1 个答案:

答案 0 :(得分:0)

如果启用write-ahead logging,则可以同时拥有读者和作者。 (但是你必须抽出时间进行检查点。)