データベース内のさまざまなテーブルに重複したレコードが多数作成されていることに気づいていますが、なぜこのようなことが起こっているのかが分かりません。興味深いことに、レコードが別の方法で複製されていても(created_at
のスタンプまで!)、私たちのusersテーブルでは、パスワードの塩とハッシュは各レコードごとに異なります - 何故かRailsは何らかの形でトランザクション/セーブ操作二度。当然のことながら、アプリケーションコードでsave
またはcreate
を複数回呼び出すことはありません。Railsによって重複レコードが作成される原因は何ですか?
この重複は、データベースに保存されたすべてのレコードでは発生しないように見えますが、まだパターンを推測することはできません。 Userモデルにはvalidates_uniqueness_of
のバリデーションもあります(ただし、テーブルの一意のキーではありませんが、これを行うにはすべての複製をクリーンアップする必要があります)。リクエストが同時に発生している場合は競合状態です。
私たちは現在、アプリケーションサーバー(現在は2台)のPassenger 3.0.11/nginxの背後にあるRails 3.2.2を実行しており、アップストリームの要求をアプリケーションサーバーに送信する1つの中央nginx Webサーバーを持っています。この設定によって何らかの形でプロセスが重複したり、何かが発生する可能性はありますか? 1つのアップストリームサーバーに要求がロックされていないことが重要ですか(つまり、1人のユーザーがイメージなどの静的コンテンツを含むページを要求した場合、1つまたは両方のアプリケーションサーバーが使用される可能性があります)。 (私はストローで握っているように感じますが、すべての可能性をカバーしたい)
これ以外に何が起こる可能性がありますか?
更新:例として、ユーザーが重複したレコードを持って今日を作成しました。両方ともcreated_at
のスタンプ2012-03-28 16:48:11
を持ち、hashed_password
とsalt
を除くすべてのコラムは同一です。だから、作成
1.2.3.4 - - [28/Mar/2012:12:48:10 -0400] "POST /en/apply/create_user HTTP/1.1" 499 0 "en/apply/create_user" "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)" "-"
1.2.3.4 - - [28/Mar/2012:12:48:11 -0400] "POST /en/apply/create_user HTTP/1.1" 302 147 "en/apply/create_user" "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)" "-"
:
アプリケーションサーバー1:
Started POST "/en/apply/create_user" for 1.2.3.4 at 2012-03-28 12:47:19 -0400
[2012-03-28 12:47:19] INFO : Processing by ApplyController#create_user as HTML
[2012-03-28 12:47:20] INFO : Rendered apply/new_user.html.erb within layouts/template (192.8ms)
Started POST "/en/apply/create_user" for 1.2.3.4 at 2012-03-28 12:48:10 -0400
[2012-03-28 12:48:10] INFO : Processing by ApplyController#create_user as HTML
[2012-03-28 12:48:11] INFO : Redirected to apply/initialize_job_application/3517
[2012-03-28 12:48:11] INFO : /app/controllers/apply_controller.rb:263:in `block (2 levels) in create_user'
アプリケーションサーバー2:
Started POST "/en/apply/create_user" for 1.2.3.4 at 2012-03-28 12:48:10 -0400
[2012-03-28 12:48:10] INFO : Processing by ApplyController#create_user as HTML
Webサーバーリクエストログから、私は以下を参照してくださいすることができますアクションは3回(おそらくエラーのために最初にフォームに戻る)、各サーバーで少なくとも1回ヒットしました。後者の2つは両方ともウェブサーバによって別々のリクエストとして登録されますが、最初はステータスコード499 Client Closed Request
(wikiページによるnginx拡張)を取得し、2番目のものは期待通りに302
になります。 499はここで問題を引き起こしていますか?
アプリケーションのログファイルを見たことがありますか?dbに重複するユーザーが存在する場合、ポイントか1つだけか? –
本番環境では、リクエストログだけではなく、mysql bin-log内に完全なレールクエリログがありませんが、作成アクションはリクエストログに複数回表示されています少なくとも1つの実例le(ただし、複数の*重複した*レコードを生成する可能性はありません) –
しかし、重複したレコードまたは単一の要求に一致する要求のペアを確認できますか? –