Mysql
 sql >> Database >  >> RDS >> Mysql

Come evitare la condizione di gara con controlli unici in Django

Il modo standard è NON gestirlo, come:

  1. la probabilità del fallimento nel tuo caso è vicina a 0;
  2. la gravità dell'errore è molto bassa.

Se, per qualche motivo, devi essere sicuro che il problema non si verifichi, sei da solo.

Non ho analizzato in dettaglio la sequenza degli eventi, ma penso che l'utilizzo del livello di isolamento SERIALIZABLE non sarà di grande aiuto, causerà solo IntegrityError (o DatabaseError ) da allevare in un luogo diverso.

Sovrascrivere Model._perform_unique_checks mi sembra una cattiva idea, faresti meglio a stare lontano dalle patch delle scimmie se possibile (ed eccolo è possibile).

Per quanto riguarda l'utilizzo del blocco della tabella per evitare errori improbabili... Beh, non sono un grande fan, quindi non posso nemmeno consigliarlo.

Ecco una bella risposta a una domanda simile:https://stackoverflow.com/a/3523439/176186 - Concordo sulla cattura di IntegrityError e riprovare è probabilmente il modo più semplice per affrontare il problema.

EDIT:ho trovato questo:Symfony2 - come recuperare da un errore di vincolo univoco dopo l'invio del modulo? e sono d'accordo con la risposta di @pid.