我有一个 SQLite 数据库,我保持打开状态并在进程 A 中写入。我希望能够在只读的基础上从进程 B 使用它。

根据 the document

  • 如果数据库已解锁,则可能无法读取(或写入)数据库 - 不合适
  • 如果数据库是共享的,那么两个进程可以读取它但第一个不能写入 - 不合适
  • 如果一个进程想要写它需要一个 EXCLUSIVE 锁,这意味着没有其他进程可以写 - 不合适

  • 进程 A 将进行大量小写操作,因此我认为在每次事务提交时制作副本不会有效率。

    我能看到的唯一方法是让读者等待直到数据库进入 UNLOCKED 状态,在读取期间获得 SHARED 锁,然后释放它。与此同时,进程 A 将想要写入并被阻塞,直到锁可用 - 如果它曾经这样做(如果进程 B 崩溃怎么办?)。这意味着进程 A 和进程 B 将争用锁——B 想要 SHARED,而 A 想要 EXCLUSIVE,这会减慢速度甚至导致并发问题。

    有什么办法可以达到我同时写读的目的吗?

    最佳答案

    使用 WAL mode 。它支持并发读取器和一个写入器。

    关于concurrency - SQLite中并发读/写和读的策略,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12117016/

    10-15 20:57