我可以从多个连接中同时读写SQLite数据库吗?


87

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


相关的问题在这里看到.. stackoverflow.com/questions/12117016/...
AndroidGeek

Answers:


142

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

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

在写入的情况下,对数据库的单次写入将在短时间内锁定数据库,即使读取也无法访问数据库文件。

从3.7.0版开始,提供了一个新的“预写日志记录”(WAL)选项,在其中可以同时进行读写。

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


因此,假设如果您必须解决一个问题,即您想在本地获取数据而不使公众可以访问,但能够并行写入多个文件,那么每次写入将需要一个数据库文件,这样就可以同时发生多次写入。是吗?我知道通常不赞成使用多个文件,但是我正试图找到一种方法来执行一项celery任务中的多次写入操作而不使用服务器端数据库,因为我只需要数据进行本地计算
PirateApp '18

有一个附注,locking_mode =排他性,可以用来将数据库锁定到一个单一的过程中,如果你要防止此功能。
斯科韦塔

20

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.