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

Wstaw wiersz i unikaj wyścigu (PHP/MySQL)

Zwykle rozwiązanie takich problemów ze współbieżnością obejmuje transakcje i optymistyczne blokowanie :kiedy aktualizujesz licznik, dodaj where klauzula, aby sprawdzić starą wartość i policzyć liczbę zaktualizowanych wierszy.

v = select value from counter where id=x.
update counter set value = v+1 where value = v and id=x

Jeśli licznik został w międzyczasie zaktualizowany, aktualizacja nie zmieni żadnego wiersza — więc wiesz, że musisz wycofać i spróbować jeszcze raz transakcję.

Jednym z problemów jest to, że może to prowadzić do dużej konkurencji , z tylko kilkoma transakcjami, które się powiodły i wieloma niepowodzeniem.

Wtedy może być lepiej trzymać się pesymistycznego blokowania , gdzie najpierw blokujesz wiersz, a następnie go aktualizujesz. Ale tylko benchmark Ci powie.

EDYTUJ

Jeśli używasz transakcji bez optymistycznego blokowania, może się zdarzyć następujący scenariusz.

Max authorized = 50. Current value = 49.

T1: start tx, read value --> 49
T2: start tx, read value --> 49
T1: update value --> 50, acquire a row lock
T1: commits --> release the lock
T2: update value --> 50, acquire a row lock
T2: commits --> release the lock

Obie transakcje powiodły się, wartość wynosi 50, ale występuje niespójność.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Ostrzeżenie:mysql_fetch_array() oczekuje, że parametr 1 będzie zasobem [...]

  2. Jak używać XPATH w MySQL select?

  3. Ukrywanie poświadczeń MySQL w aplikacji

  4. Jak sprawić, by MySQL poprawnie obsługiwał kodowanie UTF-8?

  5. php i mysql kopiują rekord z jednej tabeli do drugiej