A maneira padrão é NÃO lidar com isso, pois:
- a probabilidade de falha no seu caso é próxima de 0;
- a gravidade da falha é muito baixa.
Se, por algum motivo, você precisa ter certeza de que o problema não vai acontecer, você está sozinho.
Não analisei a sequência de eventos em detalhes, mas acho que usar o nível de isolamento SERIALIZABLE não ajudará muito, apenas causará
IntegrityError
(ou DatabaseError
) para ser levantada em um lugar diferente. Substituindo
Model._perform_unique_checks
me parece uma má ideia, é melhor você ficar longe de patches de macaco, se possível (e aqui está possível). Quanto ao uso do bloqueio de tabela para evitar erros improváveis... Bem, eu não sou um grande fã, então também não posso recomendar isso.
Aqui está uma boa resposta para uma pergunta semelhante:https://stackoverflow.com/a/3523439/176186 - Concordo que a captura de
IntegrityError
e tentar novamente é provavelmente a maneira mais sensata de lidar com o problema. EDIT:Encontrei isto:Symfony2 - como recuperar de um erro de restrição exclusiva após o envio do formulário? e concordo com a resposta do @pid.