2017-05-28 8 views
0

このスクリプトが要求/実行されるたびに、MyISAMテーブルのデータを取得するスクリプトを作成します。 クエリは次のようになります。カウンタマルチスレッドリクエストを使用して繰り返しを避ける

SELECT * FROMテーブルLIMIT $ offset、10;

問題は、$オフセットが最初の要求で0、秒で10、等であることです。 次に、毎回$ 10ずつ増分するカウンタを持つ新しいテーブルを作成しましたそのスクリプト が要求されます。

スクリプトには同時に多くのリクエストがあることを知っておく必要があります。リクエストはユーザー(訪問)ではありません。 リクエストは5台以上のPCで実行され、これらのソフトウェアのそれぞれが で実行され、1000以上のスレッドがこのスクリプトに対するリクエストを実行しています。次に、2つ以上のスレッドがこのスクリプトに正確に同時に要求した場合、 をこれらのスレッドに返さないというソリューションを検索します。 また、カウンタが完璧に増加する必要があります。機能

$offset = GetAndUpdateCounter(10); 
を呼び出す

function GetAndUpdateCounter($numberToAdd) 
{ 
    $link = mysql_connect('localhost','root','abcd1234'); 
    if(!$link) die ('Could not connect to database: '.mysql_error()); 

    mysql_select_db('dbcounter',$link); 

     // in the 2 lines below I have my question about what happend if 2 or 
     // more threads/request do this at same time, will get same result and will do same update 
     $result = mysql_query("SELECT id FROM counter"); 
    mysql_query("UPDATE counter SET id=(id+$numberToAdd);"); 

    $row = mysql_fetch_array($result, MYSQL_ASSOC); 
    mysql_close($link); 
    return $row['id']; 
} 

$ Q =するmysql_query( "オフセットテーブルリミット$ * FROM 10を選択")。

答えて

0

問題の解決策を一覧表示する前に、アドバイスをお願いします。mysql_関数を使用しないでください。最新のPHPバージョンでは潜在的に危険であり、廃止予定です。

あなたが望むものを達成するにはいくつかの方法があります。優先順位をつけて昇順に並べます。

  1. マニュアルのMySQLテーブルロック。テーブルをロックし、希望の値を選択して更新し、再度テーブルのロックを解除することができます。私が優先順位リストで最初に選んだのは、高い効率を持つ優れた内部ロックシステムです。 MySQLのマニュアルページから取得したプロトタイプ、:

    LOCK TABLES trans READ, customer WRITE; 
    SELECT SUM(value) FROM trans WHERE customer_id=some_id; 
    UPDATE customer 
        SET total_value=sum_from_previous_statement 
        WHERE customer_id=some_id; 
    UNLOCK TABLES; 
    
  2. あなたのスクリプト言語(PHP)で同じロック原理を使用。 flockロックする目的のために空のファイルを作成してフィールドを選択して更新するプロセス全体、またはMemcachedを使用して設定したり、プロセスがビジー状態かどうかをチェックしたり、プロセスが終了したときに解放することができます。これらのアプローチはです。は推奨されていません。プロセスの1つが「ビジー」モードの間に常にクラッシュし、Memcachedが解放されるまで他のプロセスをブロックする可能性があるからです。
関連する問題