En SELECT FOR UPDATE
låser raden du valde för uppdatering tills transaktionen du skapade slutar. Andra transaktioner kan bara läsa den raden men de kan inte uppdatera den så länge transaktionen för att välja för uppdatering fortfarande är öppen.
För att låsa rad(erna):
START TRANSACTION;
SELECT * FROM test WHERE id = 4 FOR UPDATE;
# Run whatever logic you want to do
COMMIT;
Transaktionen ovan kommer att vara levande och kommer att låsa raden tills den är genomförd.
För att testa det finns det olika sätt. Jag testade det med två terminalinstanser med MySQL-klienten öppen i var och en.
På den first terminal
du kör SQL:
START TRANSACTION;
SELECT * FROM test WHERE id = 4 FOR UPDATE;
# Do not COMMIT to keep the transaction alive
På den second terminal
du kan försöka uppdatera raden:
UPDATE test SET parent = 100 WHERE id = 4;
Eftersom du skapar ett val för uppdatering på first terminal
frågan ovan kommer att vänta tills transaktionen för att välja för uppdatering har genomförts eller så kommer den att ta slut.
Gå tillbaka till first terminal
och genomför transaktionen:
COMMIT;
Kontrollera den second terminal
och du kommer att se att uppdateringsfrågan kördes (om den inte tog timeout).