En SELECT FOR UPDATE
låser den række, du valgte til opdatering, indtil den transaktion, du oprettede, slutter. Andre transaktioner kan kun læse den række, men de kan ikke opdatere den, så længe transaktionen for at vælge til opdatering stadig er åben.
For at låse rækken/rækkerne:
START TRANSACTION;
SELECT * FROM test WHERE id = 4 FOR UPDATE;
# Run whatever logic you want to do
COMMIT;
Transaktionen ovenfor vil være i live og vil låse rækken, indtil den er begået.
For at teste det er der forskellige måder. Jeg testede det ved at bruge to terminalforekomster med MySQL-klienten åbnet i hver.
På den first terminal
du kører 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 prøve at opdatere rækken:
UPDATE test SET parent = 100 WHERE id = 4;
Da du opretter et valg til opdatering på first terminal
forespørgslen ovenfor vil vente, indtil transaktionen for valg til opdatering er begået, eller den vil timeout.
Gå tilbage til first terminal
og begå transaktionen:
COMMIT;
Tjek den second terminal
og du vil se, at opdateringsforespørgslen blev udført (hvis den ikke fik timeout).