避免競爭條件
如果你不知道競爭條件是什麼,請參閱此問答問題 。
以下程式碼可能受競爭條件限制:
article = Article.objects.get(pk=69)
article.views_count += 1
article.save()
如果 views_count 等於 1337,這將導致這樣的查詢:
UPDATE app_article SET views_count = 1338 WHERE id=69
如果兩個客戶端同時訪問本文,則可能發生的是第二個 HTTP 請求在第一個執行 article.save() 之前執行 Article.objects.get(pk=69)。因此,兩個請求都會有 views_count = 1337,增加它,並將 views_count = 1338 儲存到資料庫,而它實際上應該是 1339。
要解決此問題,請使用 F() 表示式:
article = Article.objects.get(pk=69)
article.views_count = F('views_count') + 1
article.save()
另一方面,這將導致這樣的查詢:
UPDATE app_article SET views_count = views_count + 1 WHERE id=69