在我的hoptoad日志中,我会定期看到
Mysql ::错误:键'YYY'重复输入'XXXX'
对于我的大多数模型都会发生这种情况,总共大约6个,根据newrelic,我会在网站上每隔几个小时看一次这个错误大约5k个请求/分钟。
我在每种情况下都在做ActiveRecord.find_or_initialize_by。这可能是,但不太可能,这是来自现场的客户端同时发布相同数据的两个帖子,因为这些是移动客户端,而且代码路径并不真正适用于此(即,这不是客户端点击快速提交按钮两次)。
find_or_initialize_by是否存在已知问题?有可能我的mysql实例(Amazon RDS)经常只是剥落(虽然我希望它在这种情况下引发异常而不是返回没有数据)...
此外,有更好的方法来插入记录吗?如果记录存在,我通常只更新其updated_at字段。
谢谢!
答案 0 :(得分:1)
这很可能是因为“检查有效性然后插入”不是原子操作。无法保证其他人无法在有效性检查和插入之间为唯一列插入具有相同值的行。
official docs提到这一点,但只是顺便提一下,他们真的不能很好地解释。 Rails Warts有一个关于这个问题的更好的页面。
听起来你在数据库中使用唯一索引支持唯一性条件,你已经尽力在数据库端阻止它。而且我不确定find_or_initialize_by
/ ON DUPLICATE KEY UPDATE
是否是一个好主意 - 这取决于您的用户正在编辑什么,以及他们编辑他们不一定想要的东西的安全后果。
希望这有帮助!
答案 1 :(得分:0)
我有这个网站sinograms.com
。我正在屏蔽疤痕新闻网站,通过频率对汉字进行分类,我发现了你想出的相同内容。
我经历了很多阶段。当前的一个只是最后一个测试,它只有几百万个索引。它们重复似乎很快就出现了;我知道这一点,因为我只能找到很常见的汉字副本,或者经常用其他词语索引。