SQLite是否在读取时锁定数据库文件?

问题描述 投票:45回答:3

我正在研究将SQLite作为存储引擎,并且很好奇是否知道SQLite是否在读取时锁定了数据库文件。

我担心读取性能,因为我计划中的项目很少写入,但是读取很多。如果数据库确实锁定,是否可以采取一些措施(例如内存缓存)来减轻这种情况?

sqlite
3个回答
45
投票

从其Wikipedia page

多个计算机进程或线程可以毫无问题地访问同一数据库。可以并行满足多个读取访问。

更确切地说,来自其FAQ

多个进程可以同时打开相同的数据库。多个进程可以同时执行SELECT。但是,任何时候都只能有一个进程对数据库进行更改。

但是,一次写入数据库,does会短暂锁定数据库,因此根本无法访问它(甚至无法读取)。细节可在File Locking And Concurrency In SQLite Version 3中找到。基本上,读取数据库没有问题,除非有人想立即写入数据库。在这种情况下,数据库仅在执行该事务所需的时间内被锁定,然后再释放该锁定。但是,在PENDING或EXCLUSIVE锁定期间,对于数据仓库的读取操作到底能做什么的细节却很少。我的猜测是它们要么返回SQLITE_BUSY要么阻塞直到可以读取。在第一种情况下,重试应该不会太难,尤其是在您期望很少写入的情况下。


51
投票

如果将数据库日志模式设置为预写日志记录(请参阅:http://www.sqlite.org/wal.html),则在读取时可以避免锁定。


0
投票

为该答案添加更多信息:

问:SQLite是否在读取时锁定数据库文件?

A:否,是

参考:https://www.sqlite.org/atomiccommit.html#_acquiring_a_read_lock

读取数据库文件的第一步是获得数据库文件的共享锁。 “共享”锁允许同时从数据库文件读取两个或多个数据库连接。但是,共享锁会阻止其他数据库连接在我们读取文件时将其写入数据库文件。

相关问题

PeeWee 关系数据库 - 获取类型错误:预期 str,而不是 ModelBase

我可以将 SQLite 数据时间字段读取为原始字符串吗?

为什么 SQLite 3 在 Python 中一个一个地执行 select 查询?

异步 SQLite python

如何在 react-native 中为 android 使用预填充的 sqlite 数据库?

Powershell 脚本打开带有可执行文件的文本文件并锁定文本文件

Table 使用 PrimaryKey 值在 Delete 上取出表锁。可能是索引损坏,我该如何解决?

如果字符串和数字在同一行,是否可以读取它们(从TXT文件中)。

尝试使用 openpyxl 从 excel 中读取单元格时,会定期出现错误(zipfile.BadZipFile:文件不是 zip 文件)

无法从 selenium java 中的 csv/excel 文件读取更新数据

如何在 intellij 13 预览版中打开本地磁盘中的 sqlite 数据库文件

如何读取旧的 Jet 3.5 数据库?

SQLite 本地日期(Shamsi)比较

TypeError:尝试使用带有反应路由器的上下文 api 传递数据时无法读取未定义的属性(读取“userData”)

读取文件时将特定空格视为字符

枚举后,在非异步 IAsyncEnumerable<T> 中实例化一个一次性的

Polars for Python:如何在读取数据帧时摆脱“确保传递文件路径而不是 python 文件对象”警告?

为什么我可以将无效数据插入数据库? [重复]

open数据库错误:无法将空值转换为对象

我是 C# 的初学者。我在从串行端口条形码阅读器读取数据时遇到问题

热门问答
最新问题