You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

其他进程写入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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 23:26:14