Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Mysql select for update - não está bloqueando as linhas de destino. Como faço para ter certeza disso?


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