SQLite是否在读取时locking数据库文件?
我正在研究SQLite作为存储引擎,并且很想知道SQLite是否在读取时locking数据库文件。
我担心阅读的performance,因为我计划的项目只有很less的写作,但是有很多读。 如果数据库确实locking,是否有措施可以采取(如内存caching)来缓解这种情况?
从其维基页面 :
多个计算机进程或线程可以访问相同的数据库而没有问题。 可以同时满足多个读取访问。
更确切地说,从它的FAQ :
多个进程可以同时打开同一个数据库。 多个进程可以同时做一个SELECT。 但是,只有一个进程可以随时对数据库进行更改。
但是,对数据库进行单一写操作会将数据库locking很短时间,所以根本没有任何东西可以访问它(甚至不读取)。 详细信息可以在文件locking和并发在SQLite版本3中find 。 基本上读取数据库是没有问题的,除非有人想立即写入数据库。 在这种情况下,数据库将被locking在执行该事务所花费的时间,并在此之后释放该锁。 然而,关于PENDING或EXCLUSIVElocking时对数据库的读操作的细节还很less。 我的猜测是,他们要么返回SQLITE_BUSY
或阻止,直到他们可以读取。 在第一种情况下,再试一次也不难,特别是如果您希望less写几行。
如果将数据库日记模式设置为预写日志(请参阅: http : //www.sqlite.org/wal.html ),则可以避免在读取时出现locking。