从 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 错误的其他原因:
- 试图
CREATE
或DROP
表或索引而SELECT
声明仍悬而未决。- 当 a
SELECT
在同一张表上处于活动状态时尝试写入表。- 尝试
SELECT
在多线程应用程序中同时在同一张表上执行两个操作,如果 sqlite 未设置为这样做。- fcntl(3,F_SETLK 对 DB 文件的调用失败。例如,这可能是由 NFS 锁定问题引起的。此问题的一种解决方案是将 DB 移走,然后将其复制回来,使其具有新的 Inode 值
所以,我想为自己澄清一下,有必要避免锁吗?我可以从两个不同的线程同时读取和写入吗?谢谢。
是否有一种“优雅的内置”不区分大小写的方式来检查 db 是否存在?
我只找到了SELECT datname FROM pg_catalog.pg_database WHERE datname='dbname'
,但这是 CS 检查。想到的第一件事是检索所有数据库名称并手动过滤它们,但我认为有更优雅的方法来做到这一点。