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