5

Przykład:strategia/wzór aby zapobiec utraconych warunki zmiana/wyścig na GAE/memcache

  1. Proces A - pobiera najnowszą wersję jednostki z memcache
  2. Proces B - Pobiera najnowszą wersję podmiotu od memcache
  3. Sposób a - powoduje trochę aktualizacji jednostki pobierane w punkcie (1), a następnie puts db/memcache
  4. Sposób B - powoduje trochę aktualizacji do jednostki pobierane w punkcie (2), a następnie puts db/memcache

Aktualizacja 3. zostaje utracona.

Jakiej strategii/wzoru można użyć, aby temu zapobiec?

Odpowiedz

2
+0

Czy nie jest to związane z samodzielnym memcached nie GAE memcache? –

+0

@KallePokki Zaktualizowałem odpowiedź. – freakish

0

Należy wykonać aktualizację wewnątrz transakcji aby atomowej.

https://developers.google.com/appengine/docs/python/ndb/transactions

+0

Samo wprowadzenie zapisów do transakcji nie poprawi sytuacji, ponieważ nie zatrzyma procesu B od nadpisania zapisu A. Aby nie potrzebować jakiejś blokady, którą A posiada, więc B nie będzie/nie może pisać, to jest gdzie CAS w memcache może pomóc. –

+0

@TimHoffman transakcje Datastore chroni dokładnie od tego. Zobacz np. prosty przykład https://developers.google.com/appengine/docs/python/datastore/transactions#Uses_for_Transactions. Ponadto, używając ndb, nie ma powodu, aby jawnie cacheować jednostki w memcache, tak jak robi to ndb. –

+0

Oczywiście, jeśli oryginalne pytanie dotyczyło memcache, porównaj i ustaw to jest droga. W mojej odpowiedzi zauważyłem słowo "db" z pytania i zakładałem, że datastore również jest zaangażowany. –