Mysql
 sql >> Database >  >> RDS >> Mysql

MySQL select for update restituisce un set vuoto anche se esiste una riga

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:

  1. Crea due righe, con valori 2 e 3.
  2. In entrambe le transazioni, esegui SELECT ... FOR UPDATE
  3. Nella transazione 1, cambia 2 in 1, 3 in 4.
  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.