Concurrency
DuckDB 支持两种并发模型:
- 一个进程可以读写数据库(默认情况下)
- 多个进程可以从数据库中读取数据(在
READ_ONLY
模式下)
其中只读模式比较简单,对于不同的客户端都会提供一个 read_only 参数来控制这个行为。我么所说的并发更多的是并发写的情况。
单进程并发写
DuckDB 支持单个进程内的并发写,规则也比较简单: 只要没有写入冲突,多个并发写入就会成功。即插入操作(INSERT)永远不会发生冲突(依然需要满足约束),即使操作的是同一个表。对一个数据库中的不同表同时更新(UPDATE DELETE)同样不会出现失败。
失败的主要是多个线程(同一个进程内的)同时更新(UPDATE DELETE)同一行数据时,尝试编辑的第二个线程操作将失败并引发冲突错误: