sql >> Base de Datos >  >> RDS >> Mysql

Cómo evitar la condición de carrera con controles únicos en Django

La forma estándar es NO manejar esto, ya que:

  1. la probabilidad de falla en su caso es cercana a 0;
  2. la gravedad de la falla es muy baja.

Si, por alguna razón, tiene que estar seguro de que el problema no sucederá, está solo.

No he analizado la secuencia de eventos en detalle, pero creo que usar el nivel de aislamiento SERIALIZABLE realmente no ayudará, solo causará IntegrityError (o DatabaseError ) para ser criado en un lugar diferente.

Anulando Model._perform_unique_checks me parece una mala idea, es mejor que te mantengas alejado de parchear monos si es posible (y aquí está está posible).

En cuanto al uso del bloqueo de tabla para evitar errores improbables... Bueno, no soy un gran fan, así que tampoco puedo recomendarlo.

Aquí hay una buena respuesta a una pregunta similar:https://stackoverflow.com/a/3523439/176186 - Estoy de acuerdo en que atrapar IntegrityError y volver a intentarlo es probablemente la forma más sencilla y sensata de solucionar el problema.

EDITAR:Encontré esto:Symfony2:¿cómo recuperarse de un error de restricción única después del envío del formulario? y estoy de acuerdo con la respuesta de @pid.