Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Mysql select for update - die Zielzeilen werden nicht gesperrt. Wie stelle ich sicher, dass dies der Fall ist?

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).