gpt4 book ai didi

SQLite非独占RESERVED锁?

转载 作者:行者123 更新时间:2023-12-02 12:18:13 26 4
gpt4 key购买 nike

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

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

我确信有非常好的数据完整性理由反对此特定功能。我只能说,就我而言,同时执行这些更新没有危险。

一个解决方案是,在每个进程中,我可以在数组中累积我希望调用的查询文本,然后在准备好写入后循环它,但我想知道 SQLite 事务是否可以自动为我执行此操作。

更新:当我说“立即执行所有更新”时,我的意思本质上是使用 SQLite 中的事务来仅获得独占锁并每个进程写入一次磁盘,而不是每个进程写入一次询问。这使得使用 SQLite 的速度提高了 100 倍。

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

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

最佳答案

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

编辑:对 mailing list thread 向OP提出了类似的建议在 sqlite-users 上进行一些后续讨论。

关于SQLite非独占RESERVED锁?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/291897/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com