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