Ecco un semplice esempio di una vista django con un potenziale condizione di corsa:condizioni corsa in 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 condizione di competizione dovrebbe essere abbastanza ovvio: Un utente può fare questa richiesta due volte, e l'applicazione potrebbe potenzialmente eseguire user = request.user
contemporaneamente, causando la sovrascrittura di una delle richieste dell'altra.
Supponiamo che la funzione calculate_points
sia relativamente complicata e che esegua calcoli basati su tutti i tipi di elementi strani che non possono essere inseriti in un singolo update
e che sarebbe difficile inserire una stored procedure.
Quindi, ecco la mia domanda: che tipo di meccanismi di blocco sono disponibili per django, per gestire situazioni simili a questo?
Al primo passaggio, sembra che tu abbia bisogno blocco a livello di database sulla riga in questione in quel punto. Vorrei consultare la documentazione SQL per il tuo database e inviare una query personalizzata per farlo. –
Preferirei una soluzione "database-agnostica" se è possibile. – Fragsworth
'@ transaction.commit_on_success' +' QuerySet.select_for_update() ' – orokusaki