2012-11-06 12 views
6

Pracuję nad systemem punktów, który da użytkownikom na mojej stronie ranking oparty na ich punktach, daję użytkownikowi +1 punkty za każdym razem, gdy ktoś sprawdza jego stronę profilu. Powiedzmy, że użytkownik ma 200 punktów, w tym samym czasie 10 użytkowników sprawdzało swoją stronę profilu, z mojego zrozumienia kod dostanie 200 dodaje 1, a wynik będzie 200 + 1 = 201, jeśli 10 użytkowników jest w tym samym czasie , jak działa baza danych?Jak dodać liczbę do bieżącej wartości w mysql (kilka razy w tym samym czasie)?

Logicznie liczy tylko jedną wizytę, ponieważ czas, przez który użytkownicy sprawdzali profil, wynosił 200, więc gdy aktualizacja MYSQL się wydarzy, zawsze będzie to 201. Czy mam rację?

Odpowiedz

17

Jeśli wybierzesz istniejącą liczbę punktów, dodaj jedną w kliencie, a następnie zapisz zaktualizowaną wartość z powrotem do bazy danych, wtedy masz race condition. Jak zauważysz, możliwe, że niektóre wyświetlenia nie zostaną policzone.

Zamiast tego należy spróbować użyć aktualizacji atomową i uniknąć problemu:

UPDATE user SET points = points + 1 WHERE id = 42 

Alternatywą jest do zapoznania się z SELECT ... FOR UPDATE. Z documentation:

Jeśli używasz FOR UPDATE z silnikiem przechowywania, który używa blokad stron lub wierszy, wiersze badane przez zapytanie są zablokowane do zapisu do końca bieżącej transakcji. Użycie LOCK IN SHARE MODE ustawia wspólną blokadę, która pozwala innym transakcjom na odczytanie badanych wierszy, ale nie na ich aktualizację lub usunięcie. Zobacz rozdział 14.2.8.3, "WYBIERZ ... DO AKTUALIZACJI i WYBIERZ ... BLOKADA W TRYBIE UDOSTĘPNIANIA Odblokowywanie"

Powiązane problemy