我的rails应用程序有一个奇怪的问题。我的应用程序在一秒钟内接受重复的POST请求
这个重复的请求包含相同的数据,奇怪地可以绕过我的模型的唯一性验证。这将导致创建两行内容完全相同的数据。
真正令我困惑的是,它每天只发生一次,从昨天开始,我不知道是什么原因造成的。(系统已经在运行,我的客户正在使用这个方法调用,每天使用200到300次,我根本无法复制它)
下面是我的代码片段的情况,并链接到完整的代码,按时间顺序排列
日志片段( http://pastebin.com/3tpua9gi )
我真的对这种行为感到困惑,而且我已经束手无策了。任何帮助都将不胜感激。
发布于 2012-11-26 12:18:11
为了快速解决这个问题,我建议您在数据库中添加一个唯一的约束(除了模型)。
rails文档显示认为唯一性验证应该伴随着数据库中的唯一约束,以防止两个连接同时插入相同的唯一值的问题。
除此之外,用户快速连续双击表单是否有问题?也许禁用表单不能正常工作,因此允许用户单击两次?
是每天在同一时间还是在特定的时间?
发布于 2012-11-26 12:34:41
这个问题是由Rails中基于模型的唯一性约束的实现方式引起的。基本上,它们的工作方式是询问数据库对于给定的唯一性约束是否存在任何现有行,如果情况如此,则拒绝创建对象。
但是,考虑到常用的事务隔离级别(通常是可重复读取),您可以有重叠的事务,这些事务可以成功地检查约束,然后插入它们的对象,而无需彼此了解。
这是因为为了实现实际的唯一性,有来使用UNIQUE索引在数据库中定义约束。这比在模型中定义约束要重要得多,因为只有数据库能够通过检查约束来确保实际的唯一性,因为在多线程操作期间,行实际上是插入/更新的。
关于您仍然希望在Ruby中额外定义约束的唯一原因是,它的错误消息更加友好,因此您可以处理常见的情况。
如果命中了数据库约束而不是Rails约束,那么在调用false时只会得到save,除了失败的数据库约束之外,没有多少信息说明出了什么问题。然而,好处是,您保证以后仍然有一个一致的数据库。
https://stackoverflow.com/questions/13564562
复制相似问题