Zum Inhalt springen

Mehrere Verbindungen

Für Tests, deren Zweck es ist zu prüfen, dass die transaktionale Verwaltung oder die Versionierung von Daten korrekt funktioniert, sind in der Regel mehrere Verbindungen nötig. Wenn wir zum Beispiel prüfen wollen, dass das Anlegen von Tabellen korrekt transaktional ist, könnten wir eine Transaktion starten und in con1 eine Tabelle anlegen und anschließend in con2 eine Abfrage absetzen, die prüft, dass die Tabelle bis zum Commit noch nicht zugänglich ist.

Mehrere Verbindungen können wir in den sqllogictests über connection labels nutzen. Das Verbindungs-Label kann optional an jedes statement oder jede query angehängt werden. Alle Abfragen mit demselben Verbindungs-Label werden in derselben Verbindung ausgeführt. Ein Test, der die oben genannte Eigenschaft prüft, sähe wie folgt aus:

statement ok con1
BEGIN TRANSACTION
statement ok con1
CREATE TABLE integers (i INTEGER);
statement error con2
SELECT * FROM integers;

Nebenläufige Verbindungen

Verbindungsmodifikatoren an Anweisungen und Abfragen führen dazu, dass mehrere Verbindungen getestet werden, aber alle Abfragen werden weiterhin nacheinander auf einem einzelnen Thread ausgeführt. Wenn wir Code aus mehreren Verbindungen nebenläufig über mehrere Threads ausführen wollen, können wir das Konstrukt concurrentloop verwenden. Die Abfragen in concurrentloop werden gleichzeitig auf getrennten Threads ausgeführt.

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

Ein Vorbehalt bei concurrentloop ist, dass Ergebnisse oft unvorhersehbar sind – wenn mehrere Clients die Datenbank gleichzeitig belasten, kann es zu (erwarteten) Transaktionskonflikten kommen. statement maybe kann verwendet werden, um mit solchen Situationen umzugehen. statement maybe akzeptiert im Wesentlichen sowohl einen Erfolg als auch einen Fehlschlag mit einer bestimmten Fehlermeldung.

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