A SELECT FOR UPDATE
blocca la riga selezionata per l'aggiornamento fino al termine della transazione creata. Altre transazioni possono solo leggere quella riga ma non possono aggiornarla finché la transazione di selezione per l'aggiornamento è ancora aperta.
Per bloccare le righe:
START TRANSACTION;
SELECT * FROM test WHERE id = 4 FOR UPDATE;
# Run whatever logic you want to do
COMMIT;
La transazione sopra sarà attiva e bloccherà la riga fino al suo commit.
Per testarlo, ci sono diversi modi. L'ho testato utilizzando due istanze di terminale con il client MySQL aperto in ciascuna.
Sul first terminal
esegui l'SQL:
START TRANSACTION;
SELECT * FROM test WHERE id = 4 FOR UPDATE;
# Do not COMMIT to keep the transaction alive
Sul second terminal
puoi provare ad aggiornare la riga:
UPDATE test SET parent = 100 WHERE id = 4;
Poiché crei una selezione per l'aggiornamento sul first terminal
la query precedente attenderà fino a quando la transazione di selezione per l'aggiornamento non sarà confermata o scadrà.
Torna al first terminal
e conferma la transazione:
COMMIT;
Controlla il second terminal
e vedrai che la query di aggiornamento è stata eseguita (se non è scaduta).