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

MySQL select for update returnerer et tomt sæt, selvom der findes en række

Ud fra afhængigheden af ​​at indstille værdien af ​​en indekseret kolonne højere eller lavere, ser det ud til, at låsen faktisk placeres på indeksindgangen. Databasemotoren scanner indekset og stopper ved den første låste post og venter på, at den bliver frigivet.

Når den første transaktion er begået, låses indekset op, og den ventende transaktion fortsætter med at scanne indekset. Fordi værdien blev sænket, er den nu tidligere i indekset. Så den genoptagede scanning ser den ikke, fordi den allerede har passeret det punkt.

For at bekræfte dette, prøv følgende test:

  1. Opret to rækker med værdierne 2 og 3.
  2. I begge transaktioner skal du udføre SELECT ... FOR UPDATE
  3. I transaktion 1 skal du ændre 2 til 1, 3 til 4.
  4. Forpligt transaktion 1.

Hvis mit gæt er korrekt, skulle transaktion 2 kun returnere rækken med 4.

Dette virker som en fejl for mig, da jeg ikke tror, ​​du nogensinde bør få delvise resultater som dette. Desværre er det svært at søge efter dette på bugs.mysql.com, fordi ordet "for" ignoreres ved søgning, fordi det er for kort eller almindeligt. Selv det at citere "til opdatering" ser ikke ud til at finde fejl, der kun indeholder denne sætning.




  1. PIVOT i sql 2005

  2. apache mysql - pakker ude af drift på 3306

  3. Heroku Rails Rake-opgave for at synkronisere produktion og lokal DB

  4. Postgres:Hvorfor er ydeevnen så dårlig på subselects med Offset/Limit