2013-08-28 22 views
5

Powiedzmy mam model z unikalnym email pola:Django blokowania pomiędzy czysty() i save()

class MyModel: 

    email = models.EmailField(unique=True) 

    def save(self): 
     .... # save model 

    def clean(self): 
     .... # validate model, make sure email doesn't already exist. 

Zazwyczaj jeśli przeglądarka prześle formularz z poczty elektronicznej jest wartość, która już istnieje, to będzie wywołaj błąd sprawdzania poprawności, ze względu na sprawdzanie poprawności formularza formularza modelu.

Jeśli dwie przeglądarki przesyłają tę samą wiadomość e-mail w tym samym czasie, ponieważ wiadomość e-mail jest wartością, która jeszcze nie istnieje, przynajmniej jedno z żądań zakończy się pomyślnie, zapisując wiersz w bazie danych. Druga prośba, jeśli nadejdzie wystarczająco długo po pierwszym, będzie traktowana normalnie - z potwierdzeniem poprawności zgłoszonym, że e-mail już istnieje. Ale jeśli nadejdzie prawie w tym samym czasie co pierwsza, to clean() zakończy się sukcesem - wiadomość e-mail jeszcze nie istnieje, ale do czasu wykonania metody save(), wiersz z pierwszego żądania zostałby zapisany. W tym ostatnim przypadku zostanie zgłoszony błąd IntegrityError, a serwer zwróci błąd Internal Server 500, co jest niepożądane.

Jak można zapobiec temu ostatniemu scenariuszowi? Transakcje bazy danych?

Odpowiedz

2

Skorzystanie z bazy danych Django w tym przypadku nie wystarczy. To, co chcesz zrobić podczas tworzenia nowego modelu, to użycie blokady tabeli bazy danych razem z transakcją. Ale django nie ma jeszcze API do blokowania tabel, dlatego będziesz musiał użyć surowego kodu SQL, aby wykonać blokadę tabeli dla swojej bazy danych.

Jeśli używasz PostgreSQL tutaj jest doskonałym przykładem: http://www.caktusgroup.com/blog/2009/05/26/explicit-table-locking-with-postgresql-and-django/

Jeśli jesteś w jakiś inny db następnie trzeba będzie zbadać, jak wykonać blokadę stołowego.

Pozdrawiam! Nie zapomnij o głosowaniu w górę tej odpowiedzi, jeśli uważasz, że to było pomocne;)

1

Podczas gdy przypadek użycia jest nieco inny, możesz przeczytać artykuł: this old answer od Alexa Martellego na temat podejścia "optymistyczna współbieżność".

Powiązane problemy