2011-12-25 1 views
0

同様のシナリオがあるとします。 私はページを持っています。私はユーザーが好きなボタンをクリックすると好きな数を保持しています。 ここに私の問題があります。「好きな」Facebookのカウントを正しく保持する

は、ページの私の現在のカウントが50

私のテーブルにはpage_idの、および他のpage_descriptionとも同類の現在の合計数が含まれていると言います。 また、私はページのIDとユーザーIDを含むテーブルLIKESを持っています。

今、私のlike.phpスクリプトは、テーブルから現在の総カウントを読み取り、そのテーブルに1を加えて更新します。また、LIKEテーブルへの新しいエントリが入力されます。

私は10人のユーザーが同時にページを好きだと言います。 スクリプトのsunsとすべてのユーザーは、初期カウントとして1つを追加した後に50を取得します。すべてのユーザーはそれを51にのみ更新します。

しかし、実際のカウントは50 + 10 = 60だったはずです。

どうすればこの問題を解決できますか?

答えて

0

SQLスクリプト自体で追加ロジックを実行できます。あなたは "Last write succeeds"というコンセプトに挑戦しています。これは、PHPページコードを使用しているために起こります。これは、どのタイプの読み書きロックも保証されていないためです。あなたは、そのロジックを追加することもできますが、このように、あなたの更新SQLを記述するために容易になるだろう:

INSERT INTO tbl_likes (page_id) VALUES (12) 
UPDATE TABLE tbl_pages (page_id, like_count) VALUES (12, (SELECT COUNT(page_id) FROM tbl_likes WHERE page_id = 12)) 

それはそのようなものになるだろう。このアルゴリズムの特筆すべき点は、tbl_pagesをインクリメントする前にtbl_likesにデータを挿入し、tbl_pagesの値は常にtbl_likesレコードに依存し、PHPページによって送信されたものではないということです。

実際には、合計カウントをtbl_pagesに維持する理由はありません。サーバーが膨大な負荷を経験していない限り、そのデータを正規化する必要があります。

+0

ああ。あなたはそのSQLロジックを1つのトランザクションの中に入れたいでしょう。 –

+0

このクエリはどのように値をインクリメントしますか? – Kraken

+0

2番目の節(update table節)は、そのpage_idを持つtbl_likesテーブル内の行の数に、like_countを設定します。既にその情報をデータベースに保存していたようです。 –