我正在研究将SQLite作为存储引擎,并且很好奇是否知道SQLite是否在读取时锁定了数据库文件。
我担心读取性能,因为我计划中的项目很少写入,但是读取很多。如果数据库确实锁定,是否可以采取一些措施(例如内存缓存)来减轻这种情况?
多个计算机进程或线程可以毫无问题地访问同一数据库。可以并行满足多个读取访问。
更确切地说,来自其FAQ:
多个进程可以同时打开相同的数据库。多个进程可以同时执行SELECT。但是,任何时候都只能有一个进程对数据库进行更改。
但是,一次写入数据库,does会短暂锁定数据库,因此根本无法访问它(甚至无法读取)。细节可在File Locking And Concurrency In SQLite Version 3中找到。基本上,读取数据库没有问题,除非有人想立即写入数据库。在这种情况下,数据库仅在执行该事务所需的时间内被锁定,然后再释放该锁定。但是,在PENDING或EXCLUSIVE锁定期间,对于数据仓库的读取操作到底能做什么的细节却很少。我的猜测是它们要么返回SQLITE_BUSY
要么阻塞直到可以读取。在第一种情况下,重试应该不会太难,尤其是在您期望很少写入的情况下。
如果将数据库日志模式设置为预写日志记录(请参阅:http://www.sqlite.org/wal.html),则在读取时可以避免锁定。
为该答案添加更多信息:
参考:https://www.sqlite.org/atomiccommit.html#_acquiring_a_read_lock
读取数据库文件的第一步是获得数据库文件的共享锁。 “共享”锁允许同时从数据库文件读取两个或多个数据库连接。但是,共享锁会阻止其他数据库连接在我们读取文件时将其写入数据库文件。