2009-06-17 55 views
37

我正在调查SQLite作为存储引擎,并且很想知道SQLite是否在读取时锁定数据库文件。SQLite是否锁定读取数据库文件?

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

回答

42

从它Wikipedia page

若干计算机的进程或线程可以毫无问题访问同一数据库。可以同时满足多个读取访问。

更确切地说,从它的FAQ

多个进程可以同时打开同一个数据库。多个进程可以同时做一个SELECT。但是,只有一个过程可以随时对数据库进行更改。

中单次写入到然而数据库,确实锁定数据库的时间很短所以没有什么可以在任何访问它(甚至不读)。详情请参阅File Locking And Concurrency In SQLite Version 3。基本上读取数据库是没有问题的,除非有人想立即写入数据库。在这种情况下,数据库将被锁定专门用于执行该事务所需的时间,然后锁定会被释放。然而,关于在PENDING或EXCLUSIVE锁定期间对数据库的读取操作究竟有哪些细节并不多见。我的猜测是他们要么返回SQLITE_BUSY要么阻止他们阅读。在第一种情况下,再次尝试应该不会太难,特别是如果您希望少写几篇。

38

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

+4

这比在WAL模式可用之前编写的接受的答案要好。 – Stretch 2012-09-13 05:44:53