Php SQLite多线程-避免不必要的读卡器阻塞

Php SQLite多线程-避免不必要的读卡器阻塞,php,multithreading,sqlite,transactions,Php,Multithreading,Sqlite,Transactions,很久以前,我将使用同一sqlite数据库的MultiRead app(php脚本)上的所有事务包装到立即开始事务中。我记得,我在某个地方读到:需要在多线程环境中使用beginimmediate包装所有事务,以避免陷入SQLITE\u BUSY`状态 现在,我正在考虑一些优化 Sqlite文档说:在立即开始之后,其他数据库连接将无法写入数据库或执行立即开始。但是,其他进程可以继续从数据库中读取。 因此,只使用立即包装写入事务可能是安全的(或任何陷阱)?使用默认的“开始交易”进行实时读取交易?或者检

很久以前,我将使用同一sqlite数据库的MultiRead app(php脚本)上的所有事务包装到
立即开始事务中。我记得,我在某个地方读到:
需要在多线程环境中使用
beginimmediate
包装所有事务,以避免陷入
SQLITE\u BUSY`状态

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

Sqlite文档说:
在立即开始之后,其他数据库连接将无法写入数据库或执行立即开始。但是,其他进程可以继续从数据库中读取。

因此,只使用
立即
包装
写入
事务可能是安全的(或任何陷阱)?使用默认的“开始交易”进行实时
读取
交易?或者检查我的代码,只避开
立即开始
开始,然后写,然后读,然后写等地方,然后重写如下循环:

BEGIN IMMEDIATE
ALL READS
then
ALL WRITES
END

如果我没有弄错的话,在后一种情况下,SQLite只在
WRITE
begin时锁定整个数据库,而不是在
beginimmediate
stars时锁定整个数据库?其他线程将能够在那里读取和启动
立即开始
语句?

当两个事务要将其读锁升级为写锁时,可能会发生死锁。 为了保证不会发生这种情况,这些事务中至少有一个必须使用
立即开始


只读事务不涉及此类死锁(它们总是在不需要更多锁的情况下结束),因此它们可以使用。

您可以使用预写日志记录(WAL)。WAL提供了更多的并发性,因为读卡器不会阻止写入程序,而写入程序也不会阻止读卡器。阅读和写作可以同时进行。更多关于它的信息可以找到

要在应用程序中启用它,请在连接字符串中使用
journal mode=WAL
PRAGMA journal\u mode=WAL