2

誰かが私のウェブサイトにアクセスすると、ページビューが最も少ないページが表示されます。ページビュー カウンターを含むすべてのページは、MYSQL データベースに格納されます。ページが表示されると、ページビュー カウンターが 1 つ増加します。

Web サーバーに複数のスレッドがある場合、競合状態に陥ります。

スレッド 1: ユーザー A がページビュー カウント 10 のページ P を取得する
スレッド 2: ページビュー カウント 10 のページ P をユーザー Bが取得する
スレッド 1: ページ P のページビュー カウントが 10 から 11 に増加され、保存される
スレッド 2: ページ P のページビュー カウント10から11に増やされて保存される

そのため、最後にページは 2 回表示されましたが、ページカウンターは 1 つしか増加しません。

解決策は、SELECT ... FOR UPDATE を使用して行をロックすることですが、ユーザー B は、ユーザー A がアクセスしているレコードが保存されるまで待機する必要があり、多くのスレッドがすべてページビューが最も少ないページを取得しようとします。遅れる。

だから私の質問:いくつかの行がロックされているときに、ロックされていない最初の行を取得して、スレッドが互いに待機する必要がないようにすることは可能ですか? MYSQLでこれを行う方法は?

次の結果になるソリューションをお勧めします。

スレッド 1: ユーザー A がページ ビュー カウント 10 でページ P をロックする
スレッド 2: ユーザー B がページ ビュー カウント 11 でページ Q をロックする (ページ P がロックされているため)
スレッド 1: ページ P のページビュー カウントが 10 から 11 に増加し、保存される
スレッド2: ページ Q のページビュー数を 11 から 12 に増やして保存

4

1 に答える 1

1

私はあなたがこのようなことをしていると思います:

 UPDATE Pages SET PageView = 11 WHERE Id = 30

定数 11 と 30 は、コード (PHP?) によって挿入されます。

より良い方法は、これを行うことです:

 UPDATE Pages SET PageView = PageView + 1 WHERE Id = 30

次に、複数のクエリで行をロックする必要がないため、解決したい問題がなくなります。

于 2010-01-14T08:48:02.410 に答える