Mysql
 sql >> Database >  >> RDS >> Mysql

Mysql select for update - non sta bloccando le righe di destinazione. Come mi assicuro che lo faccia?

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).