我有一个由两个进程使用的SQLite数据库。我想知道,使用最新版本的SQLite,当一个进程(连接)启动一个事务来写入数据库时,另一个进程是否能够同时从数据库中读取?
答案 0 :(得分:106)
我从各种来源收集信息,主要来自sqlite.org,并将它们放在一起:
首先,默认情况下,多个进程可以同时打开相同的SQLite数据库,并且可以并行满足多个读取访问。
在写入的情况下,对数据库的单次写入会将数据库锁定一小段时间,甚至读取都不能访问数据库文件。
从版本3.7.0开始,可以使用新的“Write Ahead Logging” (WAL)选项,其中读取和写入可以同时进行。
默认情况下,WAL未启用。要打开WAL,请参阅SQLite文档。
答案 1 :(得分:15)
SQLite3明确允许multiple connections:
(5)可以多个应用程序或多个实例相同 应用程序同时访问单个数据库文件?
多个进程可以同时打开同一个数据库。 多个进程可以同时执行SELECT。但是只有 一个进程可以随时对数据库进行更改 然而,时间。
要共享连接,请使用SQLite3 shared cache:
从版本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()都会覆盖所有 在同一过程中的先前电话。