Mysql
 sql >> Baza danych >  >> RDS >> Mysql

MySQL select for update zwraca pusty zestaw, mimo że istnieje wiersz

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:

  1. Utwórz dwa wiersze z wartościami 2 i 3.
  2. W obu transakcjach wykonaj SELECT ... FOR UPDATE
  3. W transakcji 1 zmień 2 na 1, 3 na 4.
  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.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. liczyć wartości w db

  2. Grupowanie rekordów z pętli while | PHP

  3. Czy istnieje bezpieczny sposób parametryzacji nazw baz danych w zapytaniach MySQL?

  4. Problem zakleszczenia MySQL InnoDB z dwoma takimi samymi zapytaniami (różne parametry)

  5. Mysql, jak zwracać wiersze, nawet jeśli dane łączenia są puste