SQLite非独占保留锁?

SQLite非独占保留锁?,sqlite,concurrency,locking,reserved,Sqlite,Concurrency,Locking,Reserved,我一直在研究如何提高网站的SQLite性能,特别是在事务方面。本质上,我所寻找的是一种在进程中延迟数据库写入的方法,这样它们就可以同时完成。但是,在我积累更新查询的同时,我希望其他进程能够同时读取和写入数据库,并且只在进程中发出提交后锁定文件进行写入 在查看文档时,似乎在事务中发出update命令后,进程将获得一个保留锁(如果我没有记错的话),这意味着任何其他试图将更新查询添加到自己的事务或提交事务的进程都无法这样做,因此会一直阻塞,直到事务使用锁在进程上提交为止 我敢肯定,针对这一特定功能,有

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

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

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

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

更新:我所说的“一次完成所有更新”实际上是指使用SQLite中的事务只获取独占锁,并在每个进程中写入磁盘一次,而不是在每个查询中写入磁盘一次。这将导致使用SQLite实现100倍的加速

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

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

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


编辑:在sqlite用户上提出了与OP类似的建议,并进行了一些后续讨论。

比附加数据库更好的方法是只创建一个临时表。(创建临时…)

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


#布拉格马日报(pragma journal_mode=WAL)

这可能行得通,但似乎是一个丑陋的黑客。它能获得什么样的性能?性能可能非常好,因为每个数据库中的事务虽然没有连接,但不能相互干扰。当数据被累积到:memory:数据库中时,它特别有效,您将主数据库附加到该数据库。