我想實現(我認爲是)一個櫃檯一個很簡單的數據模型:Django中的原子操作?
class VisitorDayTypeCounter(models.Model):
visitType = models.CharField(max_length=60)
visitDate = models.DateField('Visit Date')
counter = models.IntegerField()
當有人經過,它會尋找一個排的visitType和visitDate匹配;如果該行不存在,則會使用counter = 0創建它。
然後我們增加計數器並保存。
我擔心的是這個過程完全是一場比賽。兩個請求可以同時檢查,看看實體是否在那裏,並且他們都可以創建它。在讀取計數器並保存結果之間,可能會發出另一個請求並將其增加(導致計數丟失)。
到目前爲止,我還沒有找到一個很好的解決方法,無論是在Django文檔還是在教程中(實際上,它看起來像教程在它的投票部分有一個競爭條件)。
我該如何安全地做到這一點?
的unique_together肯定讓我覺得有點更舒適。 可能的話,這裏沒有足夠的流量導致比賽受到打擊,但由於我在同一時間學習Django,我想我想「做對」。 感謝您的幫助! – 2008-11-11 06:07:58
是的,我聽到你的聲音。也許在這裏的其他人會意識到一個ORM功能來處理這個問題,或者可以清除一些內置的安全措施是否對這種情況安全。 – 2008-11-11 06:35:07