SELECT ... FOR UPDATE
blokuje wiersze w trybie wyłączności, co oznacza, że drugi wybór nie może być kontynuowany, dopóki pierwszy nie zostanie zakończony lub wycofany. Dzieje się tak, ponieważ wynik drugiego wyboru może zależeć od zawartości wiersza, który zablokowałeś, więc musi on zablokować odczyt w wierszu, aby to sprawdzić.
Jeśli utworzysz UNIQUE INDEX
na przykład id
, możesz to zrobić;
select * from SolrCoresPreallocated where id=1 for update;
w pierwszej transakcji i;
select * from SolrCoresPreallocated where id=2 for update;
w drugim niezależnie, ponieważ unikalny indeks pozwala drugiemu wybrać znaleźć właściwy wiersz bez blokowania odczytu pierwszego.
EDYCJA:Aby uzyskać „darmowy” wiersz tak szybko, jak to możliwe, jedynym sposobem jest wykonanie dwóch transakcji;
- POCZĄTEK/WYBIERZ AKTUALIZACJI/AKTUALIZACJI, aby zajęty/ZATWIERDZ, aby uzyskać wiersz.
- BEGIN/
/UPDATE, aby zwolnić/COMMIT, aby przetworzyć wiersz i zwolnić go.
Oznacza to, że możesz potrzebować działań kompensujących w przypadku niepowodzenia procesu i wycofania transakcji, która spowoduje UAKTUALNIENIE wiersza do zwolnienia, ale ponieważ MySQL (lub standardowy SQL w tym przypadku) nie ma pojęcia „pobierz następny odblokowany wiersz ”, nie masz wielu opcji.