我正在调查SQLite作为存储引擎,并且很想知道SQLite是否在读取时锁定数据库文件。
我担心读取性能,因为我计划的项目写入很少,但许多读取。如果数据库确实锁定了,是否有可以采取的措施(例如内存缓存)来缓解这种情况?
答案 0 :(得分:49)
如果将数据库日记帐模式设置为“预写日志记录”(参见:http://www.sqlite.org/wal.html),则可以在读取时避免锁定。
答案 1 :(得分:43)
多个计算机进程或线程可以毫无问题地访问同一个数据库。可以并行地满足几个读访问。
更准确地说,来自FAQ:
多个进程可以同时打开同一个数据库。多个进程可以同时执行SELECT。但是,只有一个进程可以随时对数据库进行更改。
然而,对数据库的单次写入, 会短时间锁定数据库,因此根本无法访问它(甚至不读取)。详情可在File Locking And Concurrency In SQLite Version 3中找到。除非有人想立即写入数据库,否则基本上读取数据库是没有问题的。在这种情况下,DB将专门锁定执行该事务所花费的时间,之后释放锁定。但是,在PENDING或EXCLUSIVE锁定时对数据库的读取操作的确切细节很少。我的猜测是他们要么返回SQLITE_BUSY
要么阻止他们可以阅读。在第一种情况下,再次尝试不应该太难,特别是如果你期望很少写。
答案 2 :(得分:-1)
为此答案添加更多信息:
参考:https://www.sqlite.org/atomiccommit.html#_acquiring_a_read_lock
从数据库文件读取的第一步是获取数据库文件的共享锁。 “共享”锁允许同时从数据库文件读取两个或多个数据库连接。但是共享锁阻止了另一个数据库连接在我们读取文件时写入数据库文件