DUCKDB并发控制
duckdb官网介绍是支持MVCC与OCC
-
One process can both read and write to the database.
一个进程可以读写数据库 -
Multiple processes can read from the database, but no processes can write (
access_mode = 'READ_ONLY').多个进程可以从数据库中读取,但没有进程可以写入
注:
DuckDB针对批量操作进行了优化,因此执行许多小事务不是主要的设计目标。
只一个进程可写,或多个进程只读模式
实验验证
单进程可设置可写
/usr/local/duckdb
ATTACH IF NOT EXISTS '/data/duckdb/test.db' (READ_WRITE);
duckdb多session只读访问
启动
/usr/local/duckdb /data/duckdb/test.db
修改基本配置
SET memory_limit = '256MB';
SET max_memory = '256MB';
SET threads = 16;
查看设置
SELECT * FROM duckdb_settings()
WHERE name IN ('threads','memory_limit','max_memory') ;
┌──────────────┬───────────┬─────────────────────────────────────────────────┬────────────┬─────────┐
│ name │ value │ description │ input_type │ scope │
│ varchar │ varchar │ varchar │ varchar │ varchar │
├──────────────┼───────────┼─────────────────────────────────────────────────┼────────────┼─────────┤
│ threads │ 16 │ The number of total threads used by the system. │ BIGINT │ GLOBAL │
│ memory_limit │ 244.1 MiB │ The maximum memory of the system (e.g. 1GB) │ VARCHAR │ GLOBAL │
│ max_memory │ 244.1 MiB │ The maximum memory of the system (e.g. 1GB) │ VARCHAR │ GLOBAL │
└──────────────┴───────────┴─────────────────────────────────────────────────┴────────────┴─────────┘
数据准备
CREATE TABLE t(
id int NOT NULL,
c int DEFAULT NULL,
d int DEFAULT NULL,
PRIMARY KEY (id)
) ;
create index idx_t_c on t(c);
insert into t values(0,0,0),(5,5,5),
(10,10,10),(15,15,15),(20,20,20),(25,25,25);
启动多个session,只能只读启动
/usr/local/duckdb
ATTACH IF NOT EXISTS '/data/duckdb/test.db' (READ_ONLY);
duckdb本身不支持多进程写
IO Error: Could not set lock on file "/data/duckdb/test.db": Conflicting lock is held
in /usr/local/duckdb (PID 971877) by user root. However,
you would be able to open this database in read-only mode, e.g.
by using the -readonly parameter in the CLI. See also https://duckdb.org/docs/connect/concurrency
attach外部数据库表并发
ATTACH 'host=127.0.0.1 user=root password=123456 port=3306 database=test'
AS mysql_test (TYPE mysql_scanner, READ_WRITE);
duckdb
Binder Error: Unrecognized option for MySQL attach: read_write
MYSQL与duckdb混合访问
duckdb
ATTACH 'host=127.0.0.1 user=root password=123456 port=3306 database=test'
AS mysql_test (TYPE mysql_scanner, READ_ONLY);
begin;
select * from t;
┌───────┬───────┬───────┐
│ id │ col1 │ col2 │
│ int32 │ int32 │ int32 │
├───────┼───────┼───────┤
│ 0 │ 0 │ 0 │
│ 5 │ 5 │ 5 │
│ 10 │ 10 │ 11 │
│ 15 │ 15 │ 16 │
│ 20 │ 20 │ 20 │
│ 25 │ 25 │ 25 │
└───────┴───────┴───────┘
mysql
begin;
insert into t values(1,1,1);
commit;
duckdb
当前读
select * from t;
┌───────┬───────┬───────┐
│ id │ col1 │ col2 │
│ int32 │ int32 │ int32 │
├───────┼───────┼───────┤
│ 0 │ 0 │ 0 │
│ 1 │ 1 │ 1 │
│ 5 │ 5 │ 5 │
│ 10 │ 10 │ 11 │
│ 15 │ 15 │ 16 │
│ 20 │ 20 │ 20 │
│ 25 │ 25 │ 25 │
小结
1.未实现传统意义的C/S模式,未看到IP,端口等连接模式,默认使用内存查询OLAP为主,没有后端server模式
2.不支持多进程写,未看出MVCC,OCC细节;可能由于模拟是以shell command process为主,未用多线程模拟,不确定多线程是否满足多线程写,从结论1看,单进程里的多线程读-读,读-写,写-读 锁并发控制意义也不大
3.参数没有isolation等相关细节,不适用于OLTP场景,事务中的读是当前读
4.只适用纯OLAP,非并发场景,加速DW查询
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




