Transaktionen in MySQL gehen nicht!

AlexD1979

Erfahrenes Mitglied
Hallo,
Warum funktioniert mein SQL nicht?

SELECT * FROM KUNDE WHERE Name='Wenn' FOR UPDATE;

Wenn ich das in meinem phpmyadmin mache, sehe ich auch, das er denn SQL anders formatiert und zwar

SELECT *
FROM kunde
WHERE Name = 'Wenn'
FOR UPDATE LIMIT 0,
30

Hat das was mit dem Limit zu tun?
Damit will ich eine Zeilensperre machen, damit kein anderer in der Zeit, wo ich meine Änderungen in die Eingabemaske meiner Anwendung tippe, den Datensatz verändert. Erst nach meinem UPDATE soll der Datensatz wieder freigegeben werden.

Der Tabellentyp ist schon InnoDB und ich verwende MySQL Standard 4.0.18 und phpmyadmin2.5.6
 
Original geschrieben von AlexD1979
Hat das was mit dem Limit zu tun?
Das Limit wird benutzt, um (hier) nur die Einträge 0 bis 30 auszugeben. phpMyAdmin nutzt das lediglich der Anzeige wegen.

Damit will ich eine Zeilensperre machen, damit kein anderer in der Zeit, wo ich meine Änderungen in die Eingabemaske meiner Anwendung tippe, den Datensatz verändert. Erst nach meinem UPDATE soll der Datensatz wieder freigegeben werden.
Probier mal LOCK TABLES.

(Hätte jetzt den Link zu LIMIT bzw. LOCK im mySQL-Manual mit angegeben, aber das ist irgendwier z.Zt. leider nicht zu erreichen.)
 
Hmm LOCK TABLES sperrt doch die ganze Tabelle wenn ich das richtig verstanden habe, ich will ja bloß eine Zeile sperren.

Ich habe da dennoch was in der MySQL Doku gefunden:
Wenn Sie Konsistentes Lesen benutzen, um die Tabelle eltern zu lesen und in der Tat die Eltern des Kindes in der Tabelle sehen, können Sie dann sicher die Kind-Zeile zur Tabelle kind hinzufügen? Nein, denn es kann sein, dass zwischenzeitlich jemand anderes die Eltern-Zeile aus der Tabelle eltern gelöscht hat und Sie das nicht sehen.

Die Lösung besteht darin, das SELECT im Sperrmodus durchzuführen. LOCK IN SHARE MODE.

SELECT * FROM eltern WHERE NAME = 'Hinz' LOCK IN SHARE MODE;

Wenn Sie ein Lesen im Share-Modus durchführen, heißt das, dass die letzten verfügbaren Daten gelesen werden und eine Shared-Modus-Sperre auf die Zeile gesetzt wird, die gelesen wird. Wenn die letzten Daten zu einer noch nicht abgeschlossenen Transaktion eines anderen Benutzers gehören, wird gewartet, bis die Transaktion abgeschlossen (committed) ist. Eine Shared-Modus-Sperre verhindert, dass andere die Zeile aktualisieren oder löschen, die gerade gelesen wurde. Nachdem festgestellt wurde, dass die obige Anfrage die Eltern 'Hinr' zurückgibt, kann das Kind sicher zur Tabelle kind hinzugefügt und die Transaktion abgeschlossen werden. Dieses Beispiel zeigt, wie Sie in Ihren Applikations-Code referentielle Integrität integrieren können.
 
Zurück