很久以前,我将所有交易都包含在使用相同sqlite数据库的多线程应用程序(php脚本)中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
进行交易可能是安全的(或任何陷阱)?使用默认的“BEGIN TRANSACTION”进行实时READ
次交易?或者也许是为了检查我的代码并且只避免BEGIN IMMEDIATE
开始的地方,然后是WRITE,然后是READ,然后是WRITE等,并重写这些圆圈,如:
BEGIN IMMEDIATE
ALL READS
then
ALL WRITES
END
如果我在后一种情况下没有弄错,SQLite将仅在WRITE
开始时锁定整个数据库,而不是在BEGIN IMMEDIATE
星标时锁定?其他线程将能够读取并启动那些BEGIN IMMEDIATE
语句吗?
答案 0 :(得分:1)
当两个事务要将其读锁升级为写锁时,可能会发生死锁。
为了保证不会发生这种情况,这些交易中至少有一个必须使用BEGIN IMMEDIATE
。
只读事务不涉及此类死锁(它们总是在不需要更多锁定的情况下结束),因此可以使用BEGIN DEFERRED。
答案 1 :(得分:0)
您可以使用预写日志记录(WAL)。 WAL提供更多的并发性,因为读者不会阻止编写者,而编写者也不会阻止读者。阅读和写作可以同时进行。有关它的更多信息,请here。
要在您的应用中启用它,请在连接字符串或journal mode=WAL
PRAGMA journal_mode=WAL;