⌘+k ctrl+k
1.3 (稳定版)
搜索快捷键 cmd + k | ctrl + k
多个连接

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

我们可以在 sqllogictests 中使用 连接标签 来使用多个连接。连接标签可以可选地附加到任何 语句查询 后。所有带有相同连接标签的查询都将在同一连接中执行。验证上述属性的测试将如下所示

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