sql >> Databáze >  >> RDS >> Mysql

Jak se vyhnout race condition s jedinečnými kontrolami v Django

Standardní způsob je NEZAŘÍZIT to, jako:

  1. pravděpodobnost selhání se ve vašem případě blíží 0;
  2. závažnost selhání je velmi nízká.

Pokud si z nějakého důvodu musíte být jisti, že problém nenastane, jste na to sami.

Sled událostí jsem podrobně neanalyzoval, ale myslím si, že použití úrovně izolace SERIALIZABLE opravdu nepomůže, způsobí pouze IntegrityError (nebo DatabaseError ), aby byl vychován na jiném místě.

Přepsání Model._perform_unique_checks zní mi to jako špatný nápad, raději se pokud možno drž dál od opičího záplatování (a tady to je možné).

Pokud jde o použití zámku stolu, aby se zabránilo nepravděpodobným chybám... No, nejsem velký fanoušek, takže ani to nemohu doporučit.

Zde je pěkná odpověď na podobnou otázku:https://stackoverflow.com/a/3523439/176186 - Souhlasím s tím, že jsem zachytil IntegrityError a opakování je pravděpodobně nejjednodušší rozumný způsob, jak se s problémem vypořádat.

EDIT:Našel jsem toto:Symfony2 – jak se zotavit z jedinečné chyby omezení po odeslání formuláře? a souhlasím s odpovědí @pid.



  1. Několik způsobů, jak odstranit duplikáty z tabulek SQL

  2. Aktualizujte pomocí Join dotazu v Oracle

  3. SQL Server 2016:Návrhář zobrazení

  4. Kaskádové pole se seznamem přístupových formulářů v rozevírací nabídce nic nezobrazuje