2010-10-12 5 views
1

Dans mon application django, j'ai une vue AJAX qui est inondé avec des appels à une méthode de mise à jour, que je vais appeler IncrementMagicNumber:Gestion simultanée session Mises à jour

def IncrementMagicNumber(request) : 
    number = request.GET['increment'] 
    request.session['magicnumber'] = request.session['magicnumber'] + int(number) 
    return HttpResponse("OK!") 

Cela fonctionne très bien pour une mise à jour à la fois , mais lorsqu'un client appelle SetMagicNumber plusieurs fois de suite, les choses deviennent compliquées. Disons que MagicNumber est d'abord 0. Le client envoie 3 requêtes AJAX successives IncrementMagicNumber:

IncrementMagicNumber(2) 
IncrementMagicNumber(5) 
IncrementMagicNumber(4) 

Le client attend que la valeur soit 11 maintenant, mais apache traitement de toutes ces demandes en même temps, alors que la mise à jour finale obtient conservé. Des astuces/astuces pour synchroniser une session Django?

choses que je voudrais éviter, si possible:
- batching côté client (Je sais que cela fixerait, mais cela est un problème de back-end et est mieux fixé là-bas)
- Une sorte de verrouillage de base de données ; Je préfère éviter cette approche si possible.

Répondre

0

nous faisons quelque chose comme ceci et utilisons le verrouillage de ligne de base de données. pourquoi voulez-vous éviter cela? Je dirais qu'une sorte de mécanisme de verrouillage était nécessaire ici.

+0

Je devrais avoir clarifié. Je ne voulais pas faire de verrouillage au niveau de la table. Le verrouillage au niveau de la ligne serait bien. Pourriez-vous partager des détails sur votre implémentation? –

+0

ah bon, je ne l'ai pas fait en django, mais je l'ai fait dans un ancien ISAM que nous avons au travail, donc le code pour cela ne vous aiderait pas beaucoup! Googling "verrouillage de ligne django" jette quelques extraits, avez-vous des problèmes avec les approches standard? Considérations principales – jambox

+0

Oups! chat sur le clavier. La principale considération est de savoir si votre IncrementMagicNumber est significatif, ou juste un nombre arbitraire, comme un identifiant de série. Si ce dernier, vous pouvez toujours créer une nouvelle table avec une ligne et une colonne, juste pour contenir ce nombre. ou vous pourriez regarder dans les transactions, mais ce n'est pas une panacée AFAIK. aussi ceci: http://stackoverflow.com/questions/1030270/race-conditions-in-django – jambox