比方說,我有一個獨特的領域電子郵件的模型:Django的潔淨間的鎖定()和save()
class MyModel:
email = models.EmailField(unique=True)
def save(self):
.... # save model
def clean(self):
.... # validate model, make sure email doesn't already exist.
通常,如果瀏覽器提交表單的電子郵件是一個已存在的值,它會由於模型表單字段驗證,引發ValidationError。
如果兩個瀏覽器同時提交相同的電子郵件,並且電子郵件是一個尚不存在的值,則至少有一個請求會通過將一行保存到數據庫中而成功。另一個請求,如果它在第一個請求之後到達足夠長的時間,將會被正常處理 - 引發一個ValidationError表示電子郵件已經存在。但是,如果幾乎與第一個請求同時到達,則clean()
將成功 - 電子郵件尚不存在,但在執行save()
方法時,第一個請求的行將被保存。在後一種情況下,將會引發IntegrityError,而服務器將返回內部服務器500錯誤,這是不可取的。
如何防止這最後一種情況?數據庫事務?