Wie kann ich einen Deadlock in MySQL zu Testzwecken verursachen?

8

Ich möchte meine Python-Bibliothek, die mit MySQLdb arbeitet, in die Lage versetzen, Deadlocks zu erkennen und es erneut versuchen. Ich glaube, ich habe eine gute Lösung programmiert, und jetzt möchte ich es testen.

Irgendwelche Ideen für die einfachsten Abfragen, die ich mit MySQLdb ausführen könnte, um eine Deadlock-Bedingung zu erstellen, wäre?

Systeminfo:

  • MySQL 5.0.19
  • Client 5.1.11
  • Windows XP
  • Python 2.4 / MySQLdb 1.2.1 p2
Greg 06.11.2008, 18:06
quelle

5 Antworten

2

Hier ist ein Pseudocode, wie ich es in PHP mache:

Skript 1:

%Vor%

Skript 2:

%Vor%

Führen Sie Skript 1 aus und führen Sie Skript 2 sofort in einem anderen Terminal aus. Sie erhalten einen Deadlock, wenn die Datenbanktabelle bereits einige Daten enthält (mit anderen Worten, nach dem zweiten Mal, wenn Sie das versuchen, wird die Deadlock-Funktion aufgehoben.)

Beachten Sie, dass, wenn mysql den Befehl SLEEP () nicht berücksichtigt, das Python-Äquivalent in der Anwendung selbst verwendet wird.

    
leiavoia 11.11.2011 22:09
quelle
1

Sie können LOCK TABLE Tabellenname immer aus einer anderen Sitzung ausführen (zB mysql CLI). Das könnte den Trick machen.

Es bleibt gesperrt, bis Sie es freigeben oder die Sitzung trennen.

    
jishi 06.11.2008 21:51
quelle
1

Ich bin nicht vertraut mit Python, also entschuldige meine falsche Sprache Wenn ich das falsch behaupte ... aber öffne zwei Sitzungen (in separaten Fenstern oder von separaten Python-Prozessen - von separaten Boxen würde funktionieren ...) Dann ...

. In Sitzung A:

%Vor%

. Dann in Sitzung B:

%Vor%

. Dann gehe zurück zu Sitzung A

%Vor%

Sie werden einen Deadlock bekommen ...

    
Charles Bretana 06.11.2008 22:01
quelle
1

Sie möchten etwas in den folgenden Zeilen.

parent.py

%Vor%

child.py

%Vor%

Beachten Sie die Symmetrie. Jedes Kind fängt an, eine Ressource zu halten. Dann versuchen sie, die Ressource eines anderen zu erhalten. Sie können zum Spaß 3 Kinder und 3 Ressourcen für einen Teufelskreis haben.

Beachten Sie, dass es schwierig ist, eine Situation zu ermitteln, in der ein Deadlock auftritt. Wenn Ihre Transaktionen kurz und konsistent sind, ist ein Deadlock sehr schwer zu erreichen. Deadlock erfordert (a) Transaktionen, die Sperren für eine lange Zeit halten UND (b) Transaktionen, die Sperren in einer inkonsistenten Reihenfolge erhalten. Ich habe es am einfachsten gefunden, Deadlocks zu verhindern, indem ich meine Transaktionen kurz und konsistent halte.

Beachten Sie auch den Nicht-Determinismus. Sie können nicht vorhersagen, welches Kind mit einem Deadlock stirbt und welches nach dem anderen weiterleben wird. Nur einer von beiden muss sterben, um benötigte Ressourcen für den anderen freizugeben. Einige RDBMS behaupten, dass es eine Regel gibt, die auf der Anzahl der Ressourcen basiert, bla bla bla, aber im Allgemeinen wirst du nie wissen, wie das Opfer ausgewählt wurde.

Da die zwei Schreibvorgänge in einer bestimmten Reihenfolge sind, erwarten Sie, dass Kind 1 zuerst stirbt. Dies können Sie jedoch nicht garantieren. Es ist kein Deadlock, bis Kind 2 versucht, die Ressourcen von Kind 1 zu bekommen - die Reihenfolge, in der die ersten Personen erworben wurden, kann nicht bestimmen, wer stirbt.

Beachten Sie auch, dass dies Prozesse sind, keine Threads. Threads - wegen der Python GIL - könnten versehentlich synchronisiert werden und würden viele Aufrufe von time.sleep( 0.001 ) erfordern, um dem anderen Thread eine Chance zu geben, aufzuholen. Prozesse - dafür - sind etwas einfacher, weil sie völlig unabhängig sind.

    
S.Lott 07.11.2008 11:12
quelle
1

Ich bin mir nicht sicher, ob beide oben richtig sind. Schau dir das an:

Ссылка

    
noonex 23.09.2009 21:42
quelle

Tags und Links