Dalla dipendenza dall'impostazione del valore di una colonna indicizzata su un valore superiore o inferiore, sembra che il blocco sia effettivamente posizionato sulla voce dell'indice. Il motore di database esegue la scansione dell'indice e si ferma alla prima voce bloccata, in attesa che venga rilasciata.
Quando viene eseguito il commit della prima transazione, l'indice viene sbloccato e la transazione in attesa continua a scansionare l'indice. Poiché il valore è stato abbassato, ora è precedente nell'indice. Quindi la scansione ripresa non la vede perché ha già superato quel punto.
Per confermarlo, prova il seguente test:
- Crea due righe, con valori 2 e 3.
- In entrambe le transazioni, esegui
SELECT ... FOR UPDATE
- Nella transazione 1, cambia 2 in 1, 3 in 4.
- Commettere transazione 1.
Se la mia ipotesi è corretta, la transazione 2 dovrebbe restituire solo la riga con 4.
Questo mi sembra un bug, poiché non penso che dovresti mai ottenere risultati parziali come questo. Sfortunatamente, è difficile cercare questo su bugs.mysql.com, perché la parola "per" viene ignorata durante la ricerca perché è troppo breve o comune. Anche citando "per aggiornamento" non sembra trovare bug che contengano solo questa frase.