Diciamo che ho un modello con una e-mail campo unico:Django bloccaggio tra pulito() e 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.
Di solito se un browser invia un modulo con la posta elettronica è un valore che già esiste, sarebbe genera un errore Validation, a causa della convalida del campo modulo del modello.
Se due browser invia la stessa e-mail allo stesso tempo, con l'e-mail come valore che non esiste ancora, almeno una delle richieste avrà esito positivo salvando una riga nel database. L'altra richiesta, se arriva abbastanza a lungo dopo la prima, sarà trattata normalmente - con un ValidationError sollevato che dice che l'e-mail esiste già. Ma se arriva quasi alla stessa ora del primo, allora il clean()
avrà successo - l'e-mail non esiste ancora, ma nel momento in cui viene eseguito il metodo save()
, la riga della prima richiesta sarebbe stata salvata. In quest'ultimo caso, verrà invece generato un errore IntegrityError e il server restituirebbe un errore Internal Server 500, il che è indesiderabile.
Come si può prevenire questo ultimo scenario? Transazioni di database?