SELECT FOR UPDATE
blokuje wiersz wybrany do aktualizacji do czasu zakończenia utworzonej transakcji. Inne transakcje mogą tylko odczytać ten wiersz, ale nie mogą go zaktualizować, dopóki transakcja wyboru do aktualizacji jest nadal otwarta.
Aby zablokować wiersz(e):
START TRANSACTION;
SELECT * FROM test WHERE id = 4 FOR UPDATE;
# Run whatever logic you want to do
COMMIT;
Powyższa transakcja będzie aktywna i zablokuje wiersz, dopóki nie zostanie zatwierdzona.
Aby to przetestować, istnieją różne sposoby. Przetestowałem to przy użyciu dwóch instancji terminala z klientem MySQL otwartym w każdej z nich.
Na first terminal
uruchamiasz SQL:
START TRANSACTION;
SELECT * FROM test WHERE id = 4 FOR UPDATE;
# Do not COMMIT to keep the transaction alive
Na second terminal
możesz spróbować zaktualizować wiersz:
UPDATE test SET parent = 100 WHERE id = 4;
Ponieważ tworzysz opcję wyboru do aktualizacji na first terminal
powyższe zapytanie będzie czekać, aż transakcja wyboru do aktualizacji zostanie zatwierdzona lub przekroczy limit czasu.
Wróć do first terminal
i zatwierdź transakcję:
COMMIT;
Sprawdź second terminal
i zobaczysz, że zapytanie aktualizacyjne zostało wykonane (jeśli nie upłynął limit czasu).