验证唯一性的不足
程序员文章站
2022-07-15 13:01:33
...
唯一性验证无法真正保证唯一性。
validates :email, presence: true, format: { with: VALID_EMAIL_REGEX }, uniqueness: { case_sensitive: false }
不会吧,哪里出了问题呢?下面我来解释一下。
- Alice 用 alice@wonderland.com 注册;
- Alice 不小心按了两次提交按钮,连续发送了两次请求;
- 然后就会发生下面的事情:请求 1 在内存中新建了一个用户对象,通过验证;请求 2 也一样。请求 1 创建的用户存入了数据库,请求 2 创建的用户也存入了数据库。
- 结果是,尽管有唯一性验证,数据库中还是有两条用户记录的 Email 地址是一样的。
相信我,上面这种难以置信的过程是可能会发生的,只要有一定的访问量,在任何 Rails 网站中都可能发生。幸好解决的办法很容易实现,只需在数据库层也加上唯一性限制。我们要做的是在数据库中为 email
列建立索引,然后为索引加上唯一性限制。
通俗的来讲意思就是给这一列建立唯一性索引,来保证在数据库层数据是唯一的。
唯一性索引和普通索引的区别在于唯一性索引所属的列数据都具有唯一性。