如何防止 SQLite 数据库锁定?

And*_*lov 14 sqlite locking

从 SQLite FAQ 我知道:

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

所以,据我所知,我可以:1) 从多个线程 ( SELECT) 读取数据库 2) 从多个线程 ( SELECT)读取数据库并从单线程 ( CREATE, INSERT, DELETE)写入

但是,我读到了Write-Ahead Logging,它提供了更多的并发性,因为reader do not block writers and a writer do not block readings。读和写可以同时进行。

最后,当我找到时,我完全糊涂,当指定时:

以下是出现 SQLITE_LOCKED 错误的其他原因:

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

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

CL.*_*CL. 11

您链接的那个页面,除了相当旧之外,还讨论了通过同一数据库连接(或通过共享缓存模式下的多重连接,您不应使用)来自同一进程的访问。

当不处于 WAL 模式时,多个连接可以从同一个数据库中读取,但写入事务是排他的,即不允许其他读取器或写入器。

在 WAL 模式下,写入器和读取器不会相互阻塞,但仍然只允许一个写入器。