EEN SELECT FOR UPDATE
vergrendelt de rij die u hebt geselecteerd voor update totdat de transactie die u hebt gemaakt, eindigt. Andere transacties kunnen die rij alleen lezen, maar ze kunnen deze niet bijwerken zolang de transactie selecteren voor update nog open is.
Om de rij(en) te vergrendelen:
START TRANSACTION;
SELECT * FROM test WHERE id = 4 FOR UPDATE;
# Run whatever logic you want to do
COMMIT;
De bovenstaande transactie blijft actief en vergrendelt de rij totdat deze is vastgelegd.
Om het te testen, zijn er verschillende manieren. Ik heb het getest met behulp van twee terminalinstanties met de MySQL-client in elk geopend.
Op de first terminal
u voert de SQL uit:
START TRANSACTION;
SELECT * FROM test WHERE id = 4 FOR UPDATE;
# Do not COMMIT to keep the transaction alive
Op de second terminal
je kunt proberen de rij bij te werken:
UPDATE test SET parent = 100 WHERE id = 4;
Aangezien u een selectie voor update maakt op de first terminal
de bovenstaande query wacht totdat de transactie selecteren voor update is vastgelegd of er een time-out optreedt.
Ga terug naar de first terminal
en voer de transactie uit:
COMMIT;
Controleer de second terminal
en je zult zien dat de update-query is uitgevoerd (als er geen time-out is opgetreden).