繁体   English   中英

Django并发get_or_create

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM