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

Jak upewnić się, że w bazie danych MySQL nie ma wyścigu podczas inkrementacji pola?

Oto 3 różne podejścia:

Aktualizacja atomowa

update table set tries=tries+1 where condition=value;

i zostanie to zrobione atomowo.

Użyj transakcji

Jeśli musisz najpierw wybrać wartość i zaktualizować ją w swojej aplikacji, prawdopodobnie będziesz musiał użyć transakcji. Oznacza to, że będziesz musiał użyć InnoDB, a nie tabel MyISAM. Twoje zapytanie będzie wyglądało następująco:

BEGIN; //or any method in the API you use that starts a transaction
select tries from table where condition=value for update;
.. do application logic to add to `tries`
update table set tries=newvalue where condition=value;
END;

jeśli transakcja się nie powiedzie, może być konieczne ręczne ponowienie próby.

Schemat wersji

Typowym podejściem jest wprowadzenie do tabeli kolumny wersji. Twoje zapytania zrobiłyby coś takiego:

select tries,version from table where condition=value;
.. do application logic, and remember the old version value.
update table set tries=newvalue,version=version + 1 where condition=value and version=oldversion;

Jeśli ta aktualizacja nie powiedzie się/zwróci 0 wierszy, których dotyczy problem, ktoś inny zaktualizował tabelę w międzyczasie. Musisz zacząć od początku - to znaczy wybrać nowe wartości, wykonać logikę aplikacji i ponownie spróbować aktualizacji.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. mysql wybierz identyfikator i nazwę z innej tabeli i dołącz do zapytania

  2. Jak włączyć duży indeks w MariaDB 10?

  3. Długość MySQL() a długość_znaku()

  4. sql jak połączyć trzy zapytania z dwóch tabel w jedno zapytanie

  5. Jakiego sortowania użyć, aby „ş” i „s” były traktowane jako unikalne wartości?