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?