我正在调查SQLite作为存储引擎,并且很想知道SQLite是否在读取时锁定数据库文件.
我担心读取性能,因为我计划的项目写入很少,但许多读取.如果数据库确实锁定了,是否可以采取措施(例如内存缓存)来缓解这个问题?
如果将数据库日志模式设置为"预写日志"(请参阅:http://www.sqlite.org/wal.html),则可以在读取时避免锁定.
从其维基百科页面:
几个计算机进程或线程可以毫无问题地访问同一个数据库.可以并行地满足几个读访问.
更确切地说,从其FAQ:
多个进程可以同时打开同一个数据库.多个进程可以同时执行SELECT.但是,只有一个进程可以随时对数据库进行更改.
然而,在数据库中单次写入确实锁定短时间的数据库,以便没有任何东西可以在所有访问它(甚至不读).详细信息可以在SQLite版本3中的文件锁定和并发中找到.除非有人想立即写入数据库,否则基本上读取数据库是没有问题的.在这种情况下,DB将专门锁定执行该事务所花费的时间,之后释放锁定.但是,在PENDING或EXCLUSIVE锁定时对数据库的读取操作的确切细节很少.我的猜测是,他们要么返回SQLITE_BUSY
要么阻止他们才能阅读.在第一种情况下,再次尝试不应该太难,特别是如果你期望很少写.