【发布时间】:2013-08-28 08:13:52
【问题描述】:
假设我有一个具有唯一字段电子邮件的模型:
class MyModel:
email = models.EmailField(unique=True)
def save(self):
.... # save model
def clean(self):
.... # validate model, make sure email doesn't already exist.
通常,如果浏览器提交一个表单,其中 email 是一个已经存在的值,由于模型表单字段验证,它会引发 ValidationError。
如果两个浏览器同时提交同一封电子邮件,其中 email 是一个尚不存在的值,则至少有一个请求会通过将一行保存到数据库中来成功。另一个请求,如果它在第一个请求之后到达足够长的时间,将被正常处理 - 引发 ValidationError 表示电子邮件已经存在。但如果它与第一个几乎同时到达,那么clean() 将成功 - 电子邮件尚不存在,但在执行save() 方法时,来自第一个请求的行将有被保存。在后一种情况下,将引发 IntegrityError,服务器将返回 Internal Server 500 错误,这是不希望的。
如何防止最后一种情况发生?数据库事务?
【问题讨论】: