2011-02-06 8 views
5

私は定期的にこれは私のモデル、全部で約6のほとんどのために起こるTransient Mysql :: Error:トラフィックの多いサイトで重複するエントリ - 何か考えですか?私hoptoadログで

Mysql::Error: Duplicate entry 'XXXX' for key 'YYY'

が表示されます、と私は応じ5K要求/分程度やってサイトに一度、数時間ごとにこのエラーが表示されます。ニューレルに

私はこれらのそれぞれのケースでActiveRecord.find_or_initialize_byを行っています。同じデータの2つの同時投稿を行う現場のクライアントからのものである可能性はありますが、これはモバイルクライアントであり、コードパスは実際にそれに役立ちません(つまり、これはクライアントのクリックではありません送信ボタンを2回すばやく)。

find_or_initialize_byには既知の問題がありますか?私のmysqlインスタンス(Amazon RDS)は、たぶん単に外に出てくる可能性がありますか?(データは返さないのに対して例外は発生すると思いますが)...

また、より良い方法がありますかレコードを挿入する?レコードが存在する場合、私は一般的にupdated_atフィールドのみを更新しています。

ありがとうございます!

答えて

1

これは、「check validity then insert」がアトミック操作ではないために発生する可能性が最も高いです。有効性チェックと挿入の間に、他の誰かが一意の列に対して同じ値を持つ行を挿入できないという保証はありません。

official docsにはこのようなことが言及されていますが、実際にはそれだけでは説明できません。 Rails Wartsには問題のページがはるかに優れています。

DB内のユニークなインデックスで一意性の条件をバックアップしているように思えますが、DB側ではこれを防ぐためにできることをしています。 find_or_initialize_by/ON DUPLICATE KEY UPDATEが良いアイデアであるかどうかはわかりません。ユーザーの編集内容と、必ずしもそうではなかった内容の編集によるセキュリティの結果によって異なります。

希望すると便利です。

+0

情報をいただきありがとうございました....あなたはおそらく正しいでしょう。理論的には、私のDB操作のいずれかに待ち時間があり、ユーザが何とか何らかのアクションを繰り返すと、この動作を引き起こす可能性があります。私はそれを頻繁に見ていない(少なくとも数時間に1回、何千もの要求を処理しているように見える)。私はRails Wartsのブログ記事を読んでいます。私は彼とあなたが提案していることをやっています(DB有効性チェックでそれをバックアップしています)。 – esilver

0

私はこのサイトを持っていますsinograms.com。私は、中国語の文字を頻度で分類するためにニュース画面をスクラップする画面を表示しています。

私は多くの段階を経ました。現在のテストは最後のテストにすぎず、数百万のインデックスしかありません。それらは重複しているように見えます。私はこれを知っています。なぜなら、非常に共通しているか、または他の言葉で頻繁に索引されている中国語の文字の重複しか見つからないからです。

+0

解決策や原因が見つかりませんでしたか?そして明らかにするには、ActiveRecordを使ってRubyアプリを実行しているのですよね? FWIW私はsinatraで、レールではなく、Rubyアプリを走らせています。 – esilver

+0

RailsとAR。彼らは同じ宝石の権利を使用していますか?それは関連する必要があります。 – s84

関連する問題