对于旨在验证事务管理或数据版本控制是否正常工作的测试,通常需要使用多个连接。例如,如果我们想验证表的创建是否正确地进行事务处理,我们可能希望在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