Mysql
 sql >> Base de données >  >> RDS >> Mysql

MySQL select for update renvoie un ensemble vide même si une ligne existe

De la dépendance à la définition de la valeur d'une colonne indexée supérieure ou inférieure, il semble que le verrou soit réellement placé sur l'entrée d'index. Le moteur de base de données analyse l'index et s'arrête à la première entrée verrouillée, attendant qu'elle soit libérée.

Lorsque la première transaction est validée, l'index est déverrouillé et la transaction en attente continue d'analyser l'index. Parce que la valeur a été abaissée, elle est maintenant plus tôt dans l'index. Ainsi, l'analyse reprise ne le voit pas car il a déjà dépassé ce point.

Pour le confirmer, essayez le test suivant :

  1. Créez deux lignes, avec les valeurs 2 et 3.
  2. Dans les deux transactions, faites le SELECT ... FOR UPDATE
  3. Dans la transaction 1, remplacez 2 par 1, 3 par 4.
  4. Valider la transaction 1.

Si ma supposition est correcte, la transaction 2 devrait renvoyer uniquement la ligne avec 4.

Cela me semble être un bug, car je ne pense pas que vous devriez jamais obtenir des résultats partiels comme celui-ci. Malheureusement, il est difficile de le rechercher sur bugs.mysql.com, car le mot "pour" est ignoré lors de la recherche car il est trop court ou trop courant. Même citer "pour mise à jour" ne semble pas trouver les bogues qui ne contiennent que cette phrase.