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

Minimalny przykład użycia select... do aktualizacji w celu wyizolowania wierszy

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.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. php:SQLSTATE[HY000] [2002] Nie można nawiązać połączenia, ponieważ maszyna docelowa aktywnie je odrzuciła

  2. Jak obsłużyć zbyt wiele jednoczesnych połączeń nawet po wykorzystaniu puli połączeń?

  3. Jak zmienić wartość automatycznego przyrostu bazy danych MySQL / MariaDB?

  4. Przechowywanie daty i godziny w formacie UTC w PHP/MySQL

  5. Jak uzyskać rozmiary tabel bazy danych MySQL?