A SELECT FOR UPDATE
sperrt die Zeile, die Sie für die Aktualisierung ausgewählt haben, bis die von Ihnen erstellte Transaktion endet. Andere Transaktionen können diese Zeile nur lesen, aber sie können sie nicht aktualisieren, solange die Transaktion zum Auswählen für die Aktualisierung noch offen ist.
Um die Zeile(n) zu sperren:
START TRANSACTION;
SELECT * FROM test WHERE id = 4 FOR UPDATE;
# Run whatever logic you want to do
COMMIT;
Die obige Transaktion ist aktiv und sperrt die Zeile, bis sie festgeschrieben wird.
Um es zu testen, gibt es verschiedene Möglichkeiten. Ich habe es mit zwei Terminalinstanzen getestet, in denen jeweils der MySQL-Client geöffnet war.
Auf dem first terminal
Sie führen das SQL aus:
START TRANSACTION;
SELECT * FROM test WHERE id = 4 FOR UPDATE;
# Do not COMMIT to keep the transaction alive
Auf dem second terminal
Sie können versuchen, die Zeile zu aktualisieren:
UPDATE test SET parent = 100 WHERE id = 4;
Da Sie auf dem first terminal
eine Auswahl für die Aktualisierung erstellen Die obige Abfrage wartet, bis die Transaktion select for update festgeschrieben ist, oder es kommt zu einer Zeitüberschreitung.
Gehen Sie zurück zum first terminal
und bestätigen Sie die Transaktion:
COMMIT;
Überprüfen Sie das second terminal
und Sie werden sehen, dass die Aktualisierungsabfrage ausgeführt wurde (wenn sie nicht abgelaufen ist).