2015-02-14 16 views
6

Użyłem tylko Redis jako mojego DB, a moim klientem jest ServiceStack.Redis. Chodzi o to, że jeśli dwie równoczesne żądania wymagają aktualizacji jednego klucza, może to być sytuacja wyścigowa. Na przykładJak mogę zapobiec warunkom wyścigu, korzystając z usługi Redis?

A:

  1. int a = Get klucz
  2. MULTI
  3. a = a - 100
  4. Ustaw Klucz
  5. EXEC

B:

  1. int a = Get klucz
  2. MULTI
  3. a = a - 100
  4. Ustaw Klucz
  5. EXEC

jeśli "klucz" pochodzenia wynosi 1000. Jeśli wycisk A i B są ciągłe zmusza, właściwe wyniki tych dwóch operacji "klucza" będą 800. Ale jeśli A i B zdarzają się w tym samym czasie. Zanim A może zatwierdzić, operacja B otrzymuje wartość 1000 z "klucza" i ustawia 900 na "klucz". Nie tego chcę. Jak mogę zapobiec takim warunkom wyścigowym, używając "WATCH"?

+0

Tak, użyj WATCH. –

Odpowiedz

5

Powinieneś przeczytać dokumenty na Transactions in Redis, transakcje w Redis są w istocie grupowaniem wielu operacji, więc są wykonywane jako pojedyncza operacja atomowa.

Ponieważ jest to tylko operacja grupowania, nie można wykonywać żadnych odczytów w kontekście transakcji. Przed rozpoczęciem transakcji konieczne jest pobranie wszelkich odczytów, których potrzebujesz przed rozdaniem. Następnie można użyć Redis WATCH, aby obejrzeć klucze, które nie powinny zostać zmienione przed zakończeniem transakcji, jeśli klucz został zmodyfikowany, transakcja zakończy się niepowodzeniem i żadne operacje nie zostaną przetworzone.

+0

Dzięki za przypomnienie mi, że. W moim programie przeczytałem przed rozpoczęciem transakcji w moim programie. Zmieniłem mój pseudo kod we właściwej kolejności. Więc WATCH powinien rozwiązać mój problem? –

+0

@AllanYang Tak przy użyciu WATCH zanim jakiekolwiek odczyty zapewnią, że transakcja nie zostanie wykonana, jeśli klucz został zmodyfikowany przed wykonaniem transakcji. – mythz

Powiązane problemy