跳到主要内容

多连接

对于验证事务管理或数据版本行为的测试,通常需要使用多连接。例如,要验证建表的事务隔离性,可以在 con1 中开启事务并创建表,再在 con2 中查询,确认提交前该表不可见。

在 sqllogictest 中可通过 connection labels 使用多连接。连接标签可附加在任意 statementquery 后。同标签语句会在同一连接执行。验证上述性质的测试示例如下:

statement ok con1
BEGIN TRANSACTION

statement ok con1
CREATE TABLE integers (i INTEGER);

statement error con2
SELECT * FROM integers;

并发连接

在 statement/query 上加连接标签可测试多连接,但语句仍会在单线程中串行执行。若要在多线程中并发执行多连接代码,可使用 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