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