其他进程写入DuckDB时,为何无法以只读模式打开该文件?
DuckDB只读模式连接冲突:是特性还是Bug?
问题场景
我运行一段Python脚本创建DuckDB文件、建表并持续插入数据(脚本代码如下),在脚本运行期间用DuckDB CLI执行只读连接命令:
duckdb -readonly db.db
却报错:
Error: unable to open database "db.db": IO Error: Could not set lock on file "db.db": Resource temporarily unavailable
请问这是DuckDB的Bug还是特性?同时希望从DuckDB的角度解释「只读」的含义?
脚本代码
import duckdb, time import numpy as np if __name__ == "__main__": conn = duckdb.connect("db.db", read_only = False) conn.sql("create table if not exists quotes (ts float, bid float, ask float)") ts = 0 mq = 20000.0 ts = 0 while True: mq += np.random.rand() conn.execute("insert into quotes values(?, ?, ?)", [ts, mq - 100, mq + 100]) ts += 1 time.sleep(1) conn.close()
解答
这是特性,不是Bug
当你用读写模式打开DuckDB并持续写入时,数据库会持有排他锁,目的是防止其他连接读取到不一致的数据。此时只读连接需要获取共享锁,但排他锁和共享锁互斥,所以会触发锁冲突报错——这是DuckDB为保障数据一致性设计的正常行为。
DuckDB中「只读」模式的含义
- 操作限制:只读连接完全禁止任何修改数据库的操作,包括建表、插入、更新、删除,以及修改数据库配置。
- 锁的要求:只读连接需要获取数据库的共享锁,允许多个只读连接同时存在,但如果已有读写连接持有排他锁,只读连接无法获取共享锁,因此无法打开数据库。
- 一致性保障:只读模式的核心目的是让你读取到数据库的一致快照,而活跃的写入操作会破坏这种一致性,所以DuckDB会拒绝在有排他锁时建立只读连接。
内容的提问来源于stack exchange,提问作者lowtech
相关产品推荐
相关产品推荐

