【问题标题】:SQLite "PRIMARY KEY must be unique" while concurrent SELECT querySQLite“PRIMARY KEY 必须是唯一的”同时 SELECT 查询
【发布时间】: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


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-01
    • 2023-04-01
    • 1970-01-01
    • 2012-09-10
    • 1970-01-01
    • 2021-11-15
    相关资源
    最近更新 更多