django sql 线程安全吗?
django sql thread safe?
假设我有这个代码:
product = Product.objects.get(name='something')
product.number_sold += 1
product.save()
如果在查询期间number_sold是10,然后在save()之前,这段代码运行同时查询会return10,这意味着它会保存 number_sold = 11 两次?
换句话说,两个用户 运行ning 这个 django 视图可以获得相同的 number_sold 字段值吗?
要避免 multi-thread/process 代码中的竞争条件,您应该使用 F()-expressions
:
from django.db.models import F
product = Product.objects.get(name='something')
product.number_sold = F('number_sold') + 1
product.save()
您可以在单个查询中执行此操作:
Product.objects.filter(name='something').update(number_sold=F('number_sold')+1)
假设我有这个代码:
product = Product.objects.get(name='something')
product.number_sold += 1
product.save()
如果在查询期间number_sold是10,然后在save()之前,这段代码运行同时查询会return10,这意味着它会保存 number_sold = 11 两次? 换句话说,两个用户 运行ning 这个 django 视图可以获得相同的 number_sold 字段值吗?
要避免 multi-thread/process 代码中的竞争条件,您应该使用 F()-expressions
:
from django.db.models import F
product = Product.objects.get(name='something')
product.number_sold = F('number_sold') + 1
product.save()
您可以在单个查询中执行此操作:
Product.objects.filter(name='something').update(number_sold=F('number_sold')+1)