【发布时间】:2013-02-03 06:08:29
【问题描述】:
我对 Rails 很陌生,正在阅读有关该主题的一些资源。我有一些问题。好的,假设我们确实有一个模型,可以验证某些属性的唯一性:
class User < ActiveRecord::Base
attr_accesible :name
validates :name, uniqueness: true
end
所以,我现在有理由预期,我将无法在数据库中创建(或更准确地说——保存)两个具有相同名称的 User 实例。但是,该资源确实坚持认为它仍然是可能的!
- 部分用户登录。
- 多次点击“登录”按钮
- 请求 1 在内存中创建用户(有效)
- 请求 2 在内存中创建用户(有效)
- 请求 1 已成功保存
- 请求 2 已成功保存
后来此消息来源建议将数据库中的索引添加到“名称”列并使其唯一。
但是,如果正如我之前所说的那样——在保存过程中进行验证,那么如何保存第二个请求?还是我丢失了什么?
(我提到的资源是Rails Tutorial
【问题讨论】:
-
这只发生在大型系统中。当流量很高时,第一个请求的响应将被延迟。所以第二个请求模型验证将通过。两者都将保存在数据库中。而且你不能在本地机器上生产它。我的意思是在开发模式下。如果你想实际看到它,你的应用程序应该有很高的流量。当您扩展应用程序以在不同的盒子上获取请求时也会发生这种情况(我的意思是负载平衡)。当用户双击请求可能会转到不同的节点。两者都将同时通过验证并保存在数据库中。
-
或者您可以在验证期间或 before_save 期间将其置于睡眠状态,以查看结果。 :)
-
嗯,但是交易呢?如果我说对了,问题在于数据库本身很长时间没有响应,并且可以发出另一个同名的请求?但我认为这是不可能的,直到第一个请求完成。
标签: ruby-on-rails validation rails-activerecord