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:
- Crie duas linhas, com valores 2 e 3.
- Em ambas as transações, faça o
SELECT ... FOR UPDATE
- Na transação 1, altere 2 para 1, 3 para 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.