Simulieren Sie Tabellensperrprobleme

8

Ich habe ein System geerbt, das auf einer MySQL-Datenbank mit InnoDB-Tabellen basiert. Das System hat einen Bug, der sich unter hoher Last zeigt. Ich habe einige Jmeter-Tests erstellt, um das System zu laden, in der Hoffnung, den Fehler in einer kontrollierten Umgebung zu sehen. Allerdings betone ich das System nicht richtig und der Bug wird nie angezeigt. Die aktuelle Theorie besagt, dass stark gesperrte Tabellen einen Rollback verursachen und die Daten des Benutzers in einem ungeraden Zustand belassen. Dies bedeutet wahrscheinlich, dass die Transaktionen nicht korrekt strukturiert sind und ich das suchen und beheben will, aber zuerst muss ich das Problem finden.

Ich vermute, wenn ich verschiedene kontrollierte "Tabellensperrlasten" in der Datenbank erstellen kann, kann ich dann meine simulierten Benutzer auf dem ganzen System ausführen und den Fehler erzwingen oder die Theorie falsch beweisen, aber ich weiß nicht wie um so etwas zu erschaffen. Hat jemand eine Idee, wie man das am besten macht? An diesem Punkt bin ich mir nicht einmal sicher, wie eine schlechte erste Version aussehen würde, also würden mir alle Ideen helfen, mit denen ich angefangen habe. Danke!

    
Fran K. 01.11.2012, 03:17
quelle

1 Antwort

5

Wenn Sie speziell nach einem gesperrten Status für eine Zeile in einer Tabelle suchen (ich nehme an, dass Sie das meinen, es sei denn, Sie führen Änderungen an der Tabelle selbst im laufenden Betrieb durch). Sie können dies implementieren, indem Sie ein zweites Skript veranlassen, eine Transaktion für eine Reihe von Zeilen zu initiieren und dann für eine bestimmte Zeit zu pausieren, bevor Sie die Transaktion rückgängig machen oder festschreiben.

Nehmen wir an, Sie haben diese Tabellenstruktur zum Beispiel:

%Vor%

Öffnen Sie eine MySQL-Eingabeaufforderung und initiieren Sie eine Transaktion:

%Vor%

Starten Sie jetzt Ihre Bewerbung. Zu diesem Zeitpunkt warten alle Versuche, diese Zeilen zu verwenden, bis die initiierte Transaktion abgeschlossen ist.

Sobald Sie die Transaktion in der MySQL-Eingabeaufforderung COMMIT oder ROLLBACK ausführen, sollten die Dinge normal weiterlaufen, aber bis zu diesem Zeitpunkt befinden sich die Zeilen in einem gesperrten Zustand, der für den Zugriff nicht verfügbar ist. Es klingt wie die Bedingung, die Sie versuchen zu replizieren.

    
Shane Fright 03.11.2012, 05:00
quelle

Tags und Links