代码之家  ›  专栏  ›  技术社区  ›  Kyle Cronin

SQLite非独占保留锁?

  •  4
  • Kyle Cronin  · 技术社区  · 17 年前

    我一直在研究如何提高网站的SQLite性能,特别是在事务方面。本质上,我所寻找的是一种在进程中延迟数据库写入的方法,这样它们就可以同时完成。但是,在我积累更新查询的同时,我希望其他进程能够同时读取和写入数据库,并且只在进程中发出提交后锁定文件进行写入。

    在查看文档时,似乎在事务中发出update命令后,进程将获得一个保留锁(如果我没有记错的话),这意味着任何其他试图将更新查询添加到自己的事务或提交事务的进程都无法这样做,因此会一直阻塞,直到事务使用锁在进程上提交为止。

    我敢肯定,针对这一特定功能,有非常好的数据完整性理由。我所能说的是,在我的情况下,同时执行这些更新没有危险。

    一种解决方案是,在每个进程中,我可以将我希望调用的查询文本累积到一个数组中,然后在准备编写时循环它,但我想知道是否可以让SQLite事务自动为我完成这项工作。

    更新:

    我已经做了一些基本的测试,似乎一旦您有多个进程向它们的事务添加查询,一旦您点击一个更新查询,该进程就会尝试获取保留锁。由于只有一个进程可以拥有保留锁,这意味着任何试图获得锁的其他进程都将阻塞,直到拥有锁的进程完成事务。

    我承认这个问题可能是一个过早的优化,因为我还没有遇到任何性能方面的问题,但是我已经运行了一些简单的测试,100个用户在我的机器上用PHP创建和运行一个包含100个查询的事务大约需要4秒。

    2 回复  |  直到 16 年前
        1
  •  3
  •   Doug Currie    17 年前

    ATTACH 将一个数据库附加到另一个数据库。也许可以在单独的数据库中累积数据,当准备合并累积的行时,附加单独的数据库,在单个语句中复制行,然后分离。

    mailing list thread 在sqlite上与用户进行一些后续讨论。

        2
  •  1
  •   UrOni    15 年前

    再看一看新的WAL日志模式,它可以很好地执行您试图手动执行的操作,并允许同时写入和读取(但不是同时写入)。

    #pragma journal_mode=WAL

    推荐文章