Mysql
 sql >> Base de données >  >> RDS >> Mysql

Comment éviter les conditions de concurrence avec des vérifications uniques dans Django

La méthode standard consiste à NE PAS gérer cela, car :

  1. la probabilité de défaillance dans votre cas est proche de 0 ;
  2. la gravité de la panne est très faible.

Si, pour une raison quelconque, vous devez être sûr que le problème ne se produira pas, vous êtes seul.

Je n'ai pas analysé la séquence d'événements en détail mais je pense que l'utilisation du niveau d'isolation SERIALIZABLE n'aidera pas vraiment, cela ne causera que IntegrityError (ou DatabaseError ) pour être élevé dans un endroit différent.

Remplacement de Model._perform_unique_checks Cela me semble être une mauvaise idée, vous feriez mieux de rester à l'écart des patchs de singe si possible (et le voici c'est possibles).

Quant à l'utilisation du verrou de table pour éviter des erreurs improbables... Eh bien, je ne suis pas un grand fan, donc je ne peux pas le recommander non plus.

Voici une belle réponse à une question similaire :https://stackoverflow.com/a/3523439/176186 - Je suis d'accord pour attraper IntegrityError et réessayer est probablement le moyen le plus simple et le plus sain de résoudre le problème.

EDIT :j'ai trouvé ceci :Symfony2 - comment récupérer d'une erreur de contrainte unique après la soumission du formulaire ? et je suis d'accord avec la réponse de @pid.