Ich versuche, Datenbankcode zu schreiben, um sicherzustellen, dass er keinen Rennbedingungen unterliegt, und um sicherzustellen, dass ich die richtigen Zeilen oder Tabellen gesperrt habe. Aber ich frage mich oft: Ist mein Code korrekt? Kann man bestehende Rassenbedingungen zwingen, sich zu manifestieren? Ich möchte sichergehen, dass meine Anwendung das Richtige tut, wenn sie in einer Produktionsumgebung ausgeführt wird.
Ich weiß im Allgemeinen genau, welche gleichzeitige Abfrage wahrscheinlich ein Problem verursacht, aber ich habe keine Ahnung, wie ich sie zwingen kann, gleichzeitig ausgeführt zu werden, um festzustellen, ob das richtige Verhalten vorliegt (z. B. ich habe den richtigen Sperrtyp verwendet), dass die richtigen Fehler vorliegen geworfen, etc.
Hinweis: Ich verwende PostgreSQL und Perl. Wenn dies nicht allgemein beantwortet werden kann, sollte es wahrscheinlich als solches neu gekennzeichnet werden.
Update: Ich würde es vorziehen, wenn die Lösung programmatisch wäre. Auf diese Weise kann ich automatisierte Tests schreiben, um sicherzustellen, dass es keine Regressionen gibt.
quelle
Antworten:
Ich mache das die ganze Zeit mit meinen T-SQL Modulen.
Im Grunde ist alles, was Sie tun müssen, zu tun Ihre Module nur einige Minuten lang über zwei oder mehr Verbindungen in einer Schleife ausführen . In der Regel werden alle potenziellen Probleme in wenigen Minuten angezeigt, vorausgesetzt, Sie haben eine SQL Server-Box mit angemessenen CPUs.
Ich habe hier und hier ein paar Beispiele geschrieben .
quelle
Normalerweise arbeite ich mit dem Befehlszeilentool des RDBMS und habe nur 2 (oder mehr) Instanzen der CLI gestartet. Sie können dann eins nach dem anderen und als Rennen wiederholen (das wie ein Action-RPG aussieht) die SQL-Anweisungen, die Ihre Anwendungsebene sendet. Sie sollten die Schließsysteme in Aktion testen / fühlen, da Ihre CLI ein wenig "hängen" bleibt und darauf wartet, dass die Sperren von der anderen CLI freigegeben werden.
Wenn dies klar wie Schlamm klingt, zögern Sie nicht, dies zu sagen ;-)
quelle
Race Conditions erfordern mehrere Ausführungs-Threads. Um dies zu testen, müssen Sie in der Lage sein, einen oder mehrere Threads zu starten. In Oracle würde ich DBMS_Scheduler verwenden, um einen Prozess zur Simulation eines zweiten Benutzers auszuführen. Wenn PostgreSQL / Perl programmgesteuert einen zweiten Prozess initiieren kann, sollten Sie in der Lage sein, Folgendes zu tun:
Prozess 1 Prozess 2
Es ist gut zu überlegen, wie man mit den Rennbedingungen umgeht und vor allem, wie man sie als Einheit testet.
quelle
Solange Sie Reihen sperren, sollten Sie nicht in einen Rennzustand geraten, wie dies normalerweise der Fall ist, wenn keine Sperre vorhanden ist.
Sie könnten jedoch festgefahren sein, wenn eine Frage Ihre Frage zu lange blockiert.
Dies ist schwer zu testen, da sich die Zeit für Abfragen ändern kann, wenn die Datenbank wächst.
Abfragen, die mit 100 000 Testdatenzeilen einwandfrei funktionieren, werden mit 10 000 000 Zeilen vom Diagramm gestrichen.
Diese Art von Problem kann im Voraus sehr schwierig zu finden sein, aber viele DBs verfügen über eine Methode zum Identifizieren langsamer Abfragen.
Wenn Sie diese Regel verwenden, sollten Sie in der Lage sein, alle Fragen, die in Schwierigkeiten geraten, mit ausreichender Warnung abzufangen.
Wenn Sie alleine sperren, ist es eine andere Geschichte, aber da kann ich nicht helfen.
quelle
select for update
würden nicht existieren, wenn sie existieren ...