107

我有一个由两个进程使用的 SQLite 数据库。我想知道,对于最新版本的 SQLite,当一个进程(连接)启动一个事务以写入数据库时​​,另一个进程能否同时从数据库中读取?

4

2 回答 2

175

我从各种来源收集信息,主要来自 sqlite.org,并将它们放在一起:

首先,默认情况下,多个进程可以同时打开同一个SQLite数据库,可以并行满足多个读访问。

在写入的情况下,对数据库的一次写入会在短时间内锁定数据库,没有任何东西,甚至读取,都可以访问数据库文件。

从版本 3.7.0 开始,可以使用新的“预写日志记录”(WAL)选项,其中可以同时进行读取和写入。

默认情况下,WAL 未启用。要打开 WAL,请参阅 SQLite 文档。

于 2012-04-30T17:21:53.357 回答
25

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() 的每次调用都会覆盖同一进程中的所有先前调用。

于 2014-04-28T20:39:41.850 回答