⌘+k ctrl+k
1.1.3 (stable)
Search Shortcut cmd + k | ctrl + k
Multiple Connections

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

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

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