在验证唯一性和插入之间避免竞争条件

时间:2014-03-24 19:17:47

标签: django postgresql transactions django-1.7

我有一个标准用户注册表单的Django 1.7 beta 1项目。

从概念上讲,如果已经使用了用户名,则表单验证失败是有意义的。但是,表单验证和成功创建的用户模型的保存是单独的步骤,因此存在验证可以通过的竞争条件,但实际的user.save()可能会失败,并显示IntegrityError

我不清楚如果表单验证和user.save()步骤都包含在同一个transaction.atomic()块中会发生什么 - 我的假设是postgres在表格不会创建任何锁定读取以检查行是否存在,因此事务根本不会阻止竞争条件。

假设情况如此,处理此问题的最佳方法是什么?以下是我目前正在考虑的选项:

  • 完全跳过用户名唯一性验证,然后在保存时捕获IntegrityError,手动添加到表单错误列表。这是防弹的,但会在表单定义之外移动一些验证逻辑。
  • 同时执行验证步骤和IntegrityError周围的try / except块。这可能会添加重复的代码,但现在表单单独工作,并且在视图中使用表单不会导致竞争条件。

0 个答案:

没有答案