我担心一件事。
使用Django 1.7(最默认安装中的MySQL),我正在对Django REST Framework APIView
进行POST。
在那边,我正在做:
try:
MyModel.objects.get(**some_kwargs)
except MyModel.DoesNotExist:
MyModel.objects.custom_create(**some_kwargs) # This also creates relative models
现在,如果我要执行大量并发请求,将会发生什么?
就像您期望的那样,我只希望第一个并发请求创建一个对象,而其他任何请求都应该获得创建的对象。
我准备好了吗,谢谢Django?必须研究隔离,事务,原子性吗?还是更多关于锁定表?如何(单元)测试呢?
请指导我。
python大神给出的解决方案
这还不足以避免出现竞争状况,因为另一个请求可以创建要在get()
和custom_create()
之间检索的模型。如果在数据库级别上强制执行唯一性,则您的custom_create()
方法可能会因IntegrityError
失败。如果不是,则您的方法很好,但是由于竞争条件,您不能防止重复输入。
Django提供了get_or_create()
函数。如果您的数据库强制唯一性,则这可以防止出现竞争情况。它使用create()
方法,但是不使用您的custom_create()
方法,因此,如果可以接受,则必须重写它。否则,您可以签出get_or_create()
的source code并使用自定义创建方法自己实现。
get_or_create
的核心假设是唯一性是在数据库级别上强制执行的。由于这种强制执行,如果出现竞争条件,create
就会失败,并且get_or_create
可能会退回以获取在竞争条件期间创建的对象。如果缺少此强制措施,则create
在竞争情况下不会失败,并且将创建重复的条目(具有不同的PK)。