Z zależności od ustawienia wartości indeksowanej kolumny na wyższą lub niższą, wygląda na to, że blokada jest faktycznie umieszczana na wpisie indeksu. Silnik bazy danych skanuje indeks i zatrzymuje się na pierwszym zablokowanym wpisie, czekając na jego zwolnienie.
Po zatwierdzeniu pierwszej transakcji indeks zostaje odblokowany, a oczekująca transakcja kontynuuje skanowanie indeksu. Ponieważ wartość została obniżona, znajduje się teraz wcześniej w indeksie. Tak więc wznowione skanowanie go nie widzi, ponieważ ten punkt już minął.
Aby to potwierdzić, wypróbuj następujący test:
- Utwórz dwa wiersze z wartościami 2 i 3.
- W obu transakcjach wykonaj
SELECT ... FOR UPDATE
- W transakcji 1 zmień 2 na 1, 3 na 4.
- Zatwierdź transakcję 1.
Jeśli moje przypuszczenia są poprawne, transakcja 2 powinna zwrócić tylko wiersz z 4.
Wydaje mi się to błędem, ponieważ nie sądzę, abyś kiedykolwiek miał takie częściowe wyniki. Niestety, trudno jest znaleźć to na bugs.mysql.com, ponieważ słowo „for” jest ignorowane podczas wyszukiwania, ponieważ jest zbyt krótkie lub powszechne. Nawet cytowanie „do aktualizacji” nie wydaje się znajdować błędów, które zawierają tylko to wyrażenie.