⌘+k ctrl+k
1.4 (LTS)
搜索快捷键 cmd + k | ctrl + k
多个连接

对于旨在验证事务管理或数据版本控制功能是否正常的测试,通常需要使用多个连接。例如,如果我们想要验证表的创建是否具备正确的事务性,我们可能希望在一个事务中并在 con1 中创建一个表,然后在 con2 中发起一个查询,检查该表在提交之前是否尚不可访问。

我们可以在 sqllogictests 中使用 连接标签 (connection labels) 来使用多个连接。连接标签可以根据需要附加到任何 statement(语句)或 query(查询)后。所有带有相同连接标签的查询都将在同一个连接中执行。验证上述属性的测试示例如下:

statement ok con1
BEGIN TRANSACTION

statement ok con1
CREATE TABLE integers (i INTEGER);

statement error con2
SELECT * FROM integers;

并发连接

在语句和查询上使用连接修饰符可以测试多个连接,但所有查询仍将在单个线程上按顺序运行。如果我们想要在多个线程上并发运行来自多个连接的代码,可以使用 concurrentloop 结构。concurrentloop 中的查询将同时在不同的线程上并发运行。

concurrentloop i 0 10

statement ok
CREATE TEMP TABLE t2 AS (SELECT 1);

statement ok
INSERT INTO t2 VALUES (42);

statement ok
DELETE FROM t2

endloop

concurrentloop 的一个注意事项是结果通常不可预测——由于多个客户端可能同时向数据库发送请求,我们可能会遇到(预期的)事务冲突。statement maybe 可用于处理这些情况。statement maybe 本质上既接受成功结果,也接受带有特定错误消息的失败结果。

concurrentloop i 1 10

statement maybe
CREATE OR REPLACE TABLE t2 AS (SELECT -54124033386577348004002656426531535114 FROM t2 LIMIT 70%);
----
write-write conflict

endloop
© 2025 DuckDB 基金会,阿姆斯特丹,荷兰
行为准则 商标使用指南