我可以在只读模式下打开 duckdb 文件,而其他进程写入同一个数据库文件吗?

can I open duckdb file in read-only mode while other process writing to the the same database file?

提问人:lowtech 提问时间:10/26/2023 更新时间:10/26/2023 访问量:73

问:

我正在运行简单的脚本,该脚本创建数据库文件,创建表并插入该表(见下文)。

在脚本运行时,我正在尝试使用 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 的错误还是功能?谁能从 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()
鸭子数据库

评论


答:

1赞 keraion 10/26/2023 #1

这是 DuckDB 的设计决策

DuckDB 如何处理并发?

DuckDB 有 2 个可配置的并发选项。1.一个进程可以同时读取和写入数据库。2. 多个进程可以从数据库中读取,但没有进程可以写入 (access_mode = 'READ_ONLY')。使用选项 1 时,DuckDB 确实支持使用 MVCC(多版本并发控制)和乐观并发控制(见下文)组合的多个写入器线程,但所有这些都在该单个写入器进程中。

因此,您可以让多个只读进程读取数据库,但当数据库是可写时,只能读取一个连接。它是对整个数据库进行读取和写入的独占锁。

评论

0赞 lowtech 10/26/2023
感谢您快速解决这个问题