2017-04-06 57 views
0

我有一個觀點:Django的似乎asyncroniously出於某種原因

from app.models import Product, Sell 

def buy(request): 

    product = Product.objects.filter(user__isnull=True).first() 

    if product: 

     product.user = request.user 
     product.save() 

     Sale.objects.create(user=request.user, product=product) 

我只有一個產品實例中尚未售出的數據庫(分配給用戶)

如果我運行這個在瀏覽器控制檯片JS的:

for (i=1;i<100;i++) { 
    $.get('/buy/', function(data) {console.log(data)}); 
} 

在結果我有售對象的隨機量(從1到5)用戶與所述一個相同產品相關。 user.sale_set.count()打印3,但也有

之前只是它不應該因爲銷售應該沒有,如果產品已經有了一個用戶.filter(user__isnull=True)

所以,這似乎是可能的Django工程異步出於某種原因產生,還是我只是一個白癡?

對我來說這是非常奇怪的新行爲,可能是我的gunicorn systemd設置可以幫助嗎?

[Unit] 
Description=my_project daemon 
After=network.target 

[Service] 
User=root 
Group=nginx 
WorkingDirectory=/www/my_project 
;ExecStart=/env/my_project/bin/gunicorn --workers 3 --bind unix:/www/my_project/myproject.sock core.wsgi:application 
ExecStart=/env/my_project/bin/gunicorn core.wsgi --timeout 10000 --workers=25 -b 0.0.0.0:8000 

[Install] 
WantedBy=multi-user.target 
+1

注意,_request_是異步的JavaScript發送此行爲。 Django是同步的,但使用多線程和進程可以處理併發請求。 – knbk

回答

1

這是因爲競爭狀態可以修復使用select_for_update

from django.db import transaction 

with transaction.atomic(): 
    product = Product.objects.select_for_update().filter(user__isnull=True).first() 
    if product: 
     product.user = request.user 
     product.save() 
+0

男人,你是最棒的!我從來沒有猜到)一個音符'select_for_update'應該是一個方法調用'select_for_update()'Thxü你再一次,你是一個英雄。 А,сорян,выизБелорусии)Пасибогромное,приветизМосквы) – MaxCore

相關問題