2010-10-12 30 views
1

在我的Django應用程序,我有被用電話淹沒到一個更新的方法,我稱之爲IncrementMagicNumber一個AJAX的看法:處理同步會話更新

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

這對於一個更新工作正常,在同一時間,但是當客戶連續幾次調用SetMagicNumber時,事情就會變得混亂。比方說,magicnumber最初是0,客戶端發送了3個連續的AJAX請求IncrementMagicNumber:

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

客戶要求此值是11,現在,但是Apache同時處理所有這些要求,所以只有最後的更新變保留。同步Django會話的任何提示/技巧?

事情,我想,以避免如果可能的話:
- 客戶端配料(我知道這會解決這個問題,但這是一個後端的問題,最好是固定在那裏)
- 某種數據庫鎖定;如果可能,我寧願避免使用這種方法。

回答

0

我們這樣做,並使用數據庫行鎖定。你爲什麼要避免這種情況?我會說在這裏需​​要某種鎖定機制。

+0

我應該澄清。我不想做表級鎖定。行級鎖定會很好。你能分享一下你的實施細節嗎? – 2010-10-13 08:35:25

+0

啊對,我沒有在Django中做過這個,但是我已經在我們工作的舊ISAM中完成了,所以代碼對你來說無濟於事!谷歌搜索「Django行鎖」引發了很多片段,你遇到了標準方法的問題嗎?主要考慮 – jambox 2010-10-13 17:42:13

+0

糟糕!在鍵盤上的貓。主要考慮的問題是您的IncrementMagicNumber是否有意義,或者只是一個任意數字,如序列號。如果是後者,你總是可以用一行和一列創建一個新表格,只需保存該數字即可。或者你可以研究交易,但這不是靈丹妙藥。此外:http://stackoverflow.com/questions/1030270/race-conditions-in-django – jambox 2010-10-13 17:51:23