我有一个供两个进程使用的SQLite数据库。我想知道,在使用最新版本的SQLite的同时,一个进程(连接)启动了一个事务以将事务写入数据库时,另一个进程能否同时从数据库中读取数据?
Answers:
我从各种来源(主要是从sqlite.org)收集了信息,并将它们放在一起:
首先,默认情况下,多个进程可以同时打开同一个SQLite数据库,并且可以并行满足多个读取访问。
在写入的情况下,对数据库的单次写入将在短时间内锁定数据库,即使读取也无法访问数据库文件。
从3.7.0版开始,提供了一个新的“预写日志记录”(WAL)选项,在其中可以同时进行读写。
默认情况下,不启用WAL。要打开WAL,请参考SQLite文档。
SQLite3明确允许多个连接:
(5)多个应用程序或同一应用程序的多个实例可以同时访问一个数据库文件吗?
多个进程可以同时打开同一个数据库。多个进程可以同时执行SELECT。但是,任何时候都只能有一个进程对数据库进行更改。
要共享连接,请使用SQLite3共享缓存:
从版本3.3.0开始,SQLite包含特殊的“共享缓存”模式(默认情况下禁用)
在3.5.0版中,修改了共享缓存模式,以便可以在整个进程中共享同一缓存,而不仅仅是在单个线程中共享。
5.0启用共享缓存模式
基于每个进程启用共享缓存模式。使用C接口,以下API可用于全局启用或禁用共享缓存模式:
int sqlite3_enable_shared_cache(int);
每个调用sqlite3_enable_shared_cache()都会影响使用sqlite3_open(),sqlite3_open16()或sqlite3_open_v2()创建的后续数据库连接。已经存在的数据库连接不受影响。每次调用sqlite3_enable_shared_cache()都会覆盖同一进程中的所有先前调用。