暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

duckdb并发控制?

zhou 2024-08-18
1429
DUCKDB并发控制

duckdb官网介绍是支持MVCC与OCC

  1. One process can both read and write to the database.
    一个进程可以读写数据库

  2. 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进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论