Aquí es un simple ejemplo de una vista de Django con una condición potencial de carrera:Las condiciones de carrera en Django
# myapp/views.py
from django.contrib.auth.models import User
from my_libs import calculate_points
def add_points(request):
user = request.user
user.points += calculate_points(user)
user.save()
La condición de carrera debe ser bastante obvia: Un usuario puede hacer esta solicitud dos veces, y la solicitud puedan ejecute user = request.user
simultáneamente, provocando que una de las solicitudes sobrescriba a la otra.
Supongamos que la función calculate_points
es relativamente complicada, y hace cálculos basados en todo tipo de cosas raras que no se pueden colocar en un solo update
y sería difícil ponerlos en un procedimiento almacenado.
Así que aquí está mi pregunta: ¿Qué tipo de mecanismos de bloqueo están disponibles para django, para hacer frente a situaciones similares a esta?
En la primera pasada, parece que necesita bloqueo a nivel de base de datos en la fila en cuestión en ese punto. Consultaría la documentación de SQL para su base de datos y enviaría una consulta personalizada para hacerlo. –
Preferiría una solución "agnóstica de base de datos" si es posible. – Fragsworth
'@ transaction.commit_on_success' +' QuerySet.select_for_update() ' – orokusaki