0

Web ヒットをテーブル Hits に記録するトラフィックの多いサイトがあります。重複したヒットを破棄するロジックが用意されています (ヒットを重複として定義する定義は、この例では任意です)。

問題: 複数の Web サーバーが (同じ DB に対して) 実行されている場合、2 つ以上のヒットが異なる Web サーバーに同時に到着する可能性があり、各サーバーの観点からは、それらのいずれも重複していません (一方、それらは単一のサーバーを介してすべてシリアル化されていました)。ただし、最初のものは破棄する必要があります)。したがって、それらはすべて Hits テーブルに書き込まれます。

DB スキーマを変更して Hits テーブルのフィールドの一意性を強制することなく、Rails にトランザクションをデータベースに同期させて、重複が書き込まれないことを保証するにはどうすればよいですか? ドキュメントによると、ActiveRecord トランザクションは接続ごとにのみ適用されるため、十分ではありません (私が知る限り)。

4

1 に答える 1

0

MySQL のトランザクションは常に接続ごとであり、何がアトミック操作であるかを判断する方法は他にありません。

これを行う唯一の方法は、テーブル全体にロックをかけるか、スキーマ レベルで整合性を確保することだと思います。

于 2010-08-27T23:42:15.150 に答える