fix(quick-260909-jts): Lastprobe nachreichen statt sie zu behaupten

This commit is contained in:
2026-09-09 15:18:55 +02:00
parent abb6c8bea3
commit 604428a91d
3 changed files with 134 additions and 20 deletions
@@ -236,13 +236,23 @@ Einzelmessung (gleiche Verbindungskennung, korrekter Kontext, korrekte
Zeilenzahl). Über diese Einzelmessung hinaus wurde als zusätzliche,
sicherheitsrelevante Sorgfaltsprüfung (nicht durch den Plan verlangt, aber
durch die Tragweite dieses Bereichs geboten) beide Formen unter echter
Nebenläufigkeit erneut gemessen — 40 parallele Aufrufe, alternierend
TENANT-A/TENANT-B, gegen eine separate Experiment-Datenbank mit derselben
Struktur:
Nebenläufigkeit erneut gemessen — 40 parallele Aufrufe über EINEN
gemeinsamen Client, alternierend TENANT-A/TENANT-B.
- **Form (ii)** brach unter dieser Last mit
`PrismaClientKnownRequestError: Transaction API error: Unable to start a
transaction in the given time.` (Code `P2028`) ab. Ursache: jede
Diese Belastungsprobe lief zunächst gegen eine separate Experiment-Datenbank
und war damit **nicht nachvollziehbar** — eine Zahl, die eine Entscheidung
trug, ohne dass jemand sie hätte nachprüfen können. Genau das Anti-Muster,
das dieses Projekt sich selbst verboten hat. Sie ist deshalb als
`runConcurrencyProbe` in `apps/api/scripts/rls-scratch-check.mjs`
nachgereicht worden und läuft seither bei jedem Werkzeuglauf mit. Als
Verletzung zählt beides: ein Aufruf, der einen fremden oder gar keinen
Mandantenkontext sieht, und ein Aufruf, der abbricht.
Gemessen wird, nicht behauptet:
- **Form (ii)** bricht unter dieser Last ab, mit Fehlern der Familie
`PrismaClientKnownRequestError: Transaction API error` (Code `P2028`).
Ursache: jede
`tx.$queryRaw`-Anweisung innerhalb der interaktiven Transaktion auf dem
gebundenen Client löst selbst wieder eine VERSCHACHTELTE
Array-Transaktion auf dem äußeren, ungebundenen Client aus (weil
@@ -250,9 +260,17 @@ Struktur:
interaktive Transaktion UND jede innere Verschachtelung belegen
gleichzeitig eine Verbindung aus demselben, endlichen Pool. Unter Last
reicht der Pool nicht mehr aus.
- **Form (iii)** bestand dieselbe Belastung mit 0 Verletzungen unter 40
parallelen Aufrufen — sie belegt pro Aufruf genau eine Verbindung, ohne
Verschachtelung.
- **Form (iii)** besteht dieselbe Belastung ohne Verletzung — sie belegt
pro Aufruf genau eine Verbindung, ohne Verschachtelung.
Die konkreten Zahlen eines einzelnen Laufs stehen bewusst NICHT in diesem
Dokument, sondern fallen bei jeder Ausführung neu an; der Werkzeuglauf vom
2026-09-09 ergab 24 Verletzungen von 40 für Form (ii) und 0 von 40 für
Form (iii). **Geprüft** wird nur die Eigenschaft, auf die sich der Code
stützt — Form (iii) ohne Verletzung. Das Verhalten von Form (ii) läuft
daneben als ausgedruckte Beobachtung mit und ist bewusst KEINE Bedingung
für einen grünen Lauf: ab welcher Last sie bricht, hängt an
Verbindungsvorrat und Maschine.
Das ist der entscheidende Befund für die Werkzeugentscheidung in Aufgabe 2:
obwohl Form (ii) die im Plan geforderte EINZELMESSUNG technisch besteht,