SQLITE多线程 - 避免对读者进行不必要的阻止



很久以前,我将所有交易包装在 Multinread App (PHP脚本)上,这些交易使用相同的SQLITE数据库中的BEGIN IMMEDIATE TRANSACTION。我记得,我在某个地方阅读了:need to wrap all transactions with立即开始on multithread environment to avoid SQLITE_BUSY"状态。

现在,我正在考虑一些优化。

sqlite文档说: After a BEGIN IMMEDIATE, no other database connection will be able to write to the database or do a BEGIN IMMEDIATE. Other processes can continue to read from the database, however.

那么,也许仅将WRITE交易与IMMEDIATE包装为安全(或任何陷阱)?和默认的"开始事务"的实时READ交易?或者也许检查我的代码,并且仅避免BEGIN IMMEDIATE启动的地方,然后进行写入,然后阅读,然后写等。并重写以下圆圈,例如:

BEGIN IMMEDIATE
ALL READS
then
ALL WRITES
END

如果我在后一种情况下没有误认为SQLITE只能在WRITE开始时锁定整个数据库,而不是BEGIN IMMEDIATE星?其他线程将能够阅读并从此开始BEGIN IMMEDIATE语句?

当两个交易想升级其读取锁以写锁时,可能会发生僵局。为了确保这不可能发生,至少其中一项交易必须使用BEGIN IMMEDIATE

仅阅读交易与此类僵局无关(它们总是在不需要更多锁的情况下结束),因此它们可以开始使用。

您可以使用写入记录(WAL)。WAL提供了更多的并发性,因为读者没有阻止作家,而作家也不会阻止读者。阅读和写作可以同时进行。有关它的更多信息可以在这里找到。

在您的应用程序中启用它,在连接字符串或PRAGMA journal_mode=WAL;

中使用journal mode=WAL

最新更新