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

MySQL select for update retorna um conjunto vazio mesmo que exista uma linha


Da dependência de definir o valor de uma coluna indexada mais alto ou mais baixo, parece que o bloqueio está realmente sendo colocado na entrada do índice. O mecanismo de banco de dados verifica o índice e para na primeira entrada bloqueada, aguardando sua liberação.

Quando a primeira transação é confirmada, o índice é desbloqueado e a transação em espera continua verificando o índice. Como o valor foi reduzido, agora está mais adiantado no índice. Portanto, a verificação retomada não a vê porque já passou desse ponto.

Para confirmar isso, tente o seguinte teste:
  1. Crie duas linhas, com valores 2 e 3.
  2. Em ambas as transações, faça o SELECT ... FOR UPDATE
  3. Na transação 1, altere 2 para 1, 3 para 4.
  4. Confirme a transação 1.

Se meu palpite estiver correto, a transação 2 deve retornar apenas a linha com 4.

Isso parece um bug para mim, pois acho que você nunca deve obter resultados parciais como esse. Infelizmente, é difícil procurar por isso em bugs.mysql.com, porque a palavra "for" é ignorada na busca porque é muito curta ou comum. Mesmo citando "para atualização" não parece encontrar bugs que contenham apenas essa frase.