我有一個簡單的模型:如何避免與獨特的支票競爭條件在Django
class InvitationRequest(models.Model):
email = models.EmailField(max_length=255, unique=True)
和一個簡單的模型形式:
class InvitationRequestForm(forms.ModelForm):
class Meta:
model = InvitationRequest
現在,假設我嘗試處理它在一個標準的方式:
form = InvitationRequestForm(request.POST)
if form.is_valid():
form.save()
有一種競爭狀態,因爲驗證執行一個簡單的SELECT
查詢d確定這樣的電子郵件是否已經存儲,如果一切正常,那麼它繼續到form.save()
行。如果有一個併發進程在同一時刻執行相同的進程,那麼這兩個表單都將進行驗證,並且這兩個進程將調用form.save()
,因此一個將成功,另一個將失敗,從而導致IntegrityError
。
處理這個問題的標準方法是什麼?
我想在表單對象中有一個標準錯誤,所以我可以將它傳遞給模板並通知用戶有關該問題。
我知道:
- 我/包一切與嘗試,除了增加新的錯誤,以我的形式手動
- 我可以
SERIALIZABLE
交易(在MySQL包一切,因爲它執行下一鍵鎖定FO每一個選擇則) - 我可以使用覆蓋
Model._perform_unique_checks
,使 用它select_for_update
(與MySQL的作品,因爲下一個鍵鎖定) - 我可以獲取表級排它鎖
這些解決方案都不具吸引力,我也使用PostgreSQL,它與MySQL不同。
我不是Django的大用戶,但也許這樣的事情會幫助:http ://stackoverflow.com/q/20682954/1270148 – 2014-09-06 18:14:13