A partir de la dependencia de establecer el valor de una columna indexada más alta o más baja, parece que el bloqueo se está colocando en la entrada del índice. El motor de la base de datos escanea el índice y se detiene en la primera entrada bloqueada, esperando que se libere.
Cuando se confirma la primera transacción, el índice se desbloquea y la transacción en espera continúa escaneando el índice. Debido a que el valor se redujo, ahora está más temprano en el índice. Entonces, el escaneo reanudado no lo ve porque ya pasó ese punto.
Para confirmar esto, intente la siguiente prueba:
- Cree dos filas, con valores 2 y 3.
- En ambas transacciones, haga
SELECT ... FOR UPDATE
- En la transacción 1, cambia 2 a 1, 3 a 4.
- Confirmar transacción 1.
Si mi suposición es correcta, la transacción 2 debería devolver solo la fila con 4.
Esto me parece un error, ya que no creo que debas obtener resultados parciales como este. Desafortunadamente, es difícil buscar esto en bugs.mysql.com, porque la palabra "para" se ignora cuando se busca porque es demasiado corta o común. Incluso citando "para actualizar" no parece encontrar errores que solo contengan esta frase.