如何防止SQLite数据库锁定?


10

从SQLite FAQ中,我知道:

多个进程可以同时打开同一个数据库。多个进程可以SELECT同时进行。但是,在任何时候,只有一个进程可以对数据库进行更改。

所以,据我了解,我可以:1)从多个线程读取DB(SELECT)2)从多个线程读取DB( SELECT)和write从单个线程(CREATEINSERTDELETE

但是,我读到有关预写日志记录的问题,它提供了更多的并发性,因为读者不会阻止作者,而作家也不会阻止读者。读写可以同时进行。

最后,当我找到时,我已经完全糊涂了:

这是导致SQLITE_LOCKED错误的其他原因:

  • 试图CREATEDROP表或索引而SELECT声明仍悬而未决。
  • 当a SELECT在同一表上处于活动状态时,尝试写入该表。
  • SELECT如果未将sqlite设置为在多线程应用程序中尝试在同一表上同时执行两个操作。
  • 对数据库文件的fcntl(3,F_SETLK调用失败。例如,这可能是由NFS锁定问题引起的。针对此问题的一种解决方案是将DB移开,然后将其复制回来,使其具有新的Inode值

那么,我想为自己澄清一下,有必要避免锁吗?我可以同时从两个不同的线程读写吗?谢谢。

Answers:


8

您链接的页面除了很旧之外,还讨论了通过同一数据库连接(或不应该使用共享缓存模式下的 multipe连接)从同一进程进行的访问。

如果不在WAL模式下,则可以从同一数据库读取多个连接,但是写入事务是排他的,即,不允许其他读取器或写入器。

在WAL模式下,编写者和阅读者不会互相阻塞,但是仍然只允许一个编写者。


1
共享缓存模式有什么问题?我能够在同一进程中通过Joblb Parallel for loop用它写入多个python线程表。我遇到了一些问题,直到解决了isolation_level=None。没有共享缓存模式,如何在线程之间共享实例?
贾斯汀·迪林

1
该文档描述了缺点。如果您不知道如何避免死锁,那就特别危险。
CL。

参加聚会很晚,但是此链接很有用。manski.net/2012/10/sqlite-performance
infocyde
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.