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:
- Opret to rækker med værdierne 2 og 3.
- I begge transaktioner skal du udføre
SELECT ... FOR UPDATE
- I transaktion 1 skal du ændre 2 til 1, 3 til 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.