2012-01-04 6 views
2

Railsアプリケーションはユーザのアクティビティの増加と負荷の増加を処理するため、同時トランザクションに関するいくつかの問題が発生し始めています。クリック後にボタンを無効/削除するためにJavaScriptを使用しましたが、これはほとんどの場合有効ですが、理想的な解決策ではありません。要するに、ユーザーはアクションを複数回連続して実行しています。アクションによってDBに行が挿入されるため、テーブル内の1つの行をロックできません。影響を受けるモデルでの活動レベルが高いため、更新に使用する通常のロック機構(http://guides.rubyonrails.org/active_record_querying.html#locking-records-for-update)は使用できません。同時トランザクションからのRailsアプリケーションでのデータベースの重複挿入の防止

この質問(Prevent simultaneous transactions in a web application)は同様の問題に対処していますが、解決策を提供するためにファイルロック(flock)を使用しているため、これは複数のアプリケーションサーバーでは機能しません。私たちはRedisや他のすべてのアプリケーションサーバーに利用可能なデータストアと同様のことをすることができますが、これで本当に問題が完全に解決されるかわかりません。

同時に実行されるトランザクションから重複したデータベースの挿入を防止する最良の方法は何ですか?

答えて

4

問題が発生しているテーブルに一意のインデックスを追加してみてください。システムが重複データを挿入しようとするのを妨げることはありませんが、データベースにデータが格納されないようにします。挿入が失敗したときに挿入を処理するだけで済みます。

+0

ありがとうございます - 私は良い提案であり、確かに挿入を防ぐ必要がある、テーブル上の複数キーのユニークな制約をテストしています。これを防ぐ方法に関する他の推奨事項があれば興味がありました。私はその応答に感謝します。 – shedd

関連する問題