Rozważmy taką sytuację:Czy transakcja zatrzymuje wszystkie problemy z kondycją wyścigu w MySQL?
- rozpocząć transakcji
- Insert 20 rekordów do tabeli z auto_increment klucza
- Uzyskaj identyfikator pierwsza wkładka (powiedzmy to
153
) - zaktualizować wszystkie rekordy w tej tabeli gdzie
id >= 153
- Commit
Czy krok 4 jest bezpieczny?
Oznacza to, że jeśli kolejne żądanie przychodzi prawie dokładnie w tym samym czasie i wstawia kolejne 20 rekordów po kroku 2 powyżej, ale przed krokiem 4, czy wystąpi warunek wyścigu?
Dlaczego miałbyś mieć osobny krok aktualizacji, a nie tylko wstawianie poprawnych danych? To raczej dziwne. Nie musisz martwić się o "warunki wyścigu", jeśli włożyłeś poprawne dane w pierwszej kolejności. Aktualizacja "WHERE id> 153" jest również bardzo dziwnym zapytaniem. Identyfikatory automatyczne inkrementacji nie mają dla nich żadnej logiki, więc nigdy nie powinieneś (o ile mi wiadomo) aktualizować wyłącznie na podstawie identyfikatora. I na koniec nie znam żadnej funkcji "first insert id". –
@ButtleButkus http://dev.mysql.com/doc/refman/5.0/en/information-functions.html#function_last-insert-id "Jeśli wstawisz wiele wierszy za pomocą pojedynczej instrukcji INSERT, funkcja LAST_INSERT_ID() zwróci wartość wygenerowany dla pierwszego wstawionego wiersza " – nickf
Masz rację co do LAST_INSERT_ID(), ale nie zmienia to faktu, że pytanie wydaje się być hipotetyczną sytuacją, która nigdy nie istniałaby, gdyby przestrzegano podstawowej struktury i procedury bazy danych. Dlaczego kryterium aktualizacji byłoby kiedykolwiek wartością bezsensownego identyfikatora? Nie mogę wymyślić żadnego powodu. Nie nazwałbym tego "warunkiem wyścigu", ponieważ jest to bezsensowne. Dlaczego miałbyś aktualizować natychmiast po wstawieniu, kiedy mógłbyś po prostu wstawić poprawne wartości na początek?To są prawdziwe powody, dla których to pytanie nie ma sensu. –