Estoy tratando de poner en práctica (lo que creo que es) un modelo de datos bastante simple para un contador:Operaciones atómicas en Django?
class VisitorDayTypeCounter(models.Model):
visitType = models.CharField(max_length=60)
visitDate = models.DateField('Visit Date')
counter = models.IntegerField()
Cuando alguien viene a través, se buscará una fila que coincide con el visitType y visitDate; si esta fila no existe, se creará con counter = 0.
Luego incrementamos el contador y lo guardamos.
Mi preocupación es que este proceso es totalmente una carrera. Dos solicitudes podrían verificar simultáneamente para ver si la entidad está allí, y ambas podrían crearla. Entre leer el contador y guardar el resultado, podría surgir otra solicitud e incrementarla (lo que daría como resultado una cuenta perdida).
Hasta ahora no he encontrado una buena manera de evitar esto, ya sea en la documentación de Django o en el tutorial (de hecho, parece que el tutorial tiene una condición de carrera en la parte de Votación).
¿Cómo puedo hacer esto de forma segura?
¿Todavía no es posible que la base de datos ejecute esta consulta en dos conexiones separadas al mismo tiempo y todavía tenga una condición de carrera (con una probabilidad mucho menor)?Todo depende de las transacciones ocultas alrededor de esta consulta implimented por la capa de conexión que hacen op atomic. –
Si ve la nota clave "Por qué odio Django" de DjangoCon, este tipo de consulta se da como una forma correcta y libre de condiciones de carrera para hacer un incremento en SQL (el problema es que el ORM de Django no puede hacerlo por usted)) – iconoplast
Voy a ver tus diapositivas ... has confirmado mi sospecha de que el ORM no lo haría por sí solo. ¡Gracias por la ayuda! –