[英]Django concurrent get_or_create
我担心一件事。
使用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? 必须研究隔离,事务,原子性吗? 还是更多关于锁定表? 如何(单元)测试呢?
请指导我。
这还不足以避免出现竞争状况,因为另一个请求可以创建要在get()
和custom_create()
之间检索的模型。 如果在数据库级别强制执行唯一性,则您的custom_create()
方法可能会因IntegrityError
失败。 如果不是,则您的方法很好,但是由于竞争条件,您不能防止重复输入。
Django提供了get_or_create()
函数。 如果您的数据库强制唯一性,则这可以防止出现竞争情况。 它使用create()
方法,但是不使用您的custom_create()
方法,因此,如果可以接受,则必须重写它。 否则,您可以签出get_or_create()
的源代码 ,并使用自定义的create方法自己实现它。
get_or_create
的核心假设是在数据库级别强制执行唯一性。 由于这种强制措施,如果发生竞争条件,则create
失败,并且get_or_create
可能会退回以获取在竞争条件期间创建的对象。 如果缺少此强制措施,则create
不会在竞争条件下失败,并且将创建重复条目(具有不同的PK)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.