瞬态Mysql ::错误:在高流量网站上重复输入 - 任何想法?

esi*_*ver 5 ruby mysql indexing ruby-on-rails duplicates

在我的hoptoad日志中,我会定期看到

Mysql ::错误:键'YYY'重复输入'XXXX'

这种情况发生在我的大多数模型中,总共大约6个,并且我会在网站上每隔几个小时看到一次这个错误,根据newrelic执行大约5k请求/分钟.

我在每种情况下都在做ActiveRecord.find_or_initialize_by.这可能是,但不太可能,这是来自现场的客户端同时发布相同数据的两个帖子,因为这些是移动客户端,而且代码路径并不真正适用于此(即,这不是客户端点击快速提交按钮两次).

find_or_initialize_by是否存在已知问题?是不是有可能我的mysql实例(亚马逊RDS)经常只是剥落(虽然我希望它在这种情况下引发异常而不是返回没有数据)...

此外,是否有更好的方式来插入记录?如果记录存在,我通常只更新其updated_at字段.

谢谢!

Xav*_*olt 1

这很可能发生,因为“检查有效性然后插入”不是原子操作。不能保证其他人无法在有效性检查和插入之间插入具有相同值的唯一列的行。

官方文档提到了这一点,但只是顺便提及,而且他们确实没有很好地解释它。 Rails Warts在这个问题上有一个更好的页面。

听起来您正在使用数据库中的唯一索引来支持唯一性条件,因此您已经在数据库方面采取了措施来防止这种情况发生。我不确定find_or_initialize_by/ON DUPLICATE KEY UPDATE是否是一个好主意 - 这取决于您的用户正在编辑的内容,以及他们编辑他们不一定打算编辑的内容的安全后果。

希望这可以帮助!