Mysql
 sql >> Datenbank >  >> RDS >> Mysql

So vermeiden Sie Race-Conditions mit einzigartigen Prüfungen in Django

Der Standardweg ist, dies NICHT zu behandeln, wie:

  1. die Ausfallwahrscheinlichkeit liegt in Ihrem Fall nahe 0;
  2. der Schweregrad des Fehlers ist sehr gering.

Wenn Sie aus irgendeinem Grund sicher sein müssen, dass das Problem nicht auftritt, sind Sie auf sich allein gestellt.

Ich habe die Abfolge der Ereignisse nicht im Detail analysiert, aber ich denke, dass die Verwendung des Isolationslevels SERIALIZABLE nicht wirklich hilft, es wird nur IntegrityError verursachen (oder DatabaseError ) an einem anderen Ort aufzuziehen.

Überschreiben von Model._perform_unique_checks Klingt für mich nach einer schlechten Idee, halten Sie sich nach Möglichkeit besser vom Affen-Patching fern (und hier ist es ist möglich).

Was die Verwendung der Tabellensperre angeht, um unwahrscheinliche Fehler zu vermeiden... Nun, ich bin kein großer Fan, also kann ich das auch nicht empfehlen.

Hier ist eine nette Antwort auf eine ähnliche Frage:https://stackoverflow.com/a/3523439/176186 - Ich stimme zu, dass IntegrityError abgefangen wird und ein erneuter Versuch ist wahrscheinlich der einfachste und vernünftigste Weg, um das Problem zu lösen.

BEARBEITEN:Ich habe das gefunden:Symfony2 - wie behebe ich einen Unique-Constraint-Fehler nach dem Absenden des Formulars? und ich stimme der Antwort von @pid zu.