A
SELECT FOR UPDATE
bloqueia a linha selecionada para atualização até que a transação criada termine. Outras transações só podem ler essa linha, mas não podem atualizá-la enquanto a transação de seleção para atualização ainda estiver aberta. Para bloquear a(s) linha(s):
START TRANSACTION;
SELECT * FROM test WHERE id = 4 FOR UPDATE;
# Run whatever logic you want to do
COMMIT;
A transação acima estará ativa e bloqueará a linha até que seja confirmada.
Para testá-lo, existem diferentes maneiras. Eu testei usando duas instâncias de terminal com o cliente MySQL aberto em cada uma.
No
first terminal
você executa o SQL:START TRANSACTION;
SELECT * FROM test WHERE id = 4 FOR UPDATE;
# Do not COMMIT to keep the transaction alive
No
second terminal
você pode tentar atualizar a linha:UPDATE test SET parent = 100 WHERE id = 4;
Como você cria um select para atualização no
first terminal
a consulta acima aguardará até que a transação de seleção para atualização seja confirmada ou atingirá o tempo limite. Volte para o
first terminal
e confirme a transação:COMMIT;
Verifique o
second terminal
e você verá que a consulta de atualização foi executada (se não tiver expirado).