很久以前,我将所有交易包装在 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