簡體   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