3

次の 3 つの PHP スクリプトによってクエリされている、多くのゲーム オブジェクトを含むデータベースがあります。

  1. リスト オブジェクト:必要なすべてのアイテムを含む JSON オブジェクトを取得します
  2. オブジェクトの追加:データベースにオブジェクトを追加します
  3. リセット:テーブルからすべてのオブジェクトを消去します

3つすべてがある程度機能します。ただし、タイミングのミスマッチがあります。ゲームがリセット関数を呼び出すと、ゲームが再起動します。ゲームが再起動すると、すべてのオブジェクトが自動的に読み込まれます。残念ながら、ここに問題があります。ゲームがリセットされたばかりの場合、オブジェクトはスクリプト 1 によって引き続きプルされます。

トランザクションを知っていますが、それらを使用したことがなく、ここでそれらをどのように実装するかわかりません。私のトランザクションは、異なる時間に実行される異なるスクリプトからのものを含んでいるためです。

おまけとして: このセットアップ (AS3 > php > MySQL) では負荷が高いと問題が発生しますか? このゲームは 10 人、100 人、1000 人に取り上げられる可能性がありますが、その件について私が読めるものはありますか?

編集:新しいアイデア/質問

現在、ワイプは次のように機能します。オブジェクト テーブルには、reset メソッドが呼び出されると「1」に設定される「deleted」フィールドがあります。既存のデータをアーカイブ テーブルにコピーしてから、ライブ テーブルを切り捨てる方が賢明かもしれません...

編集:これが私が使用している(関連する)PHPコードです

オブジェクトを追加:

if ($db_found) {

$x = $_GET['x'];
$y = $_GET['y'];
$type = $_GET['type'];
$name = $_GET['name'];
$text = $_GET['text'];

$SQL = "INSERT INTO bodies  (x,y,type,name,text)
VALUES ('".$x."','".$y."','".$type."','".$name."','".$text."' )";

if (!mysql_query($SQL))
  {
  die('Error: ' . mysql_error());
  }

};

mysql_close($db_handle);

オブジェクトのリスト/取得:

if ($db_found) {

$SQL = "SELECT * FROM bodies WHERE deleted = 0";
$res = mysql_query($SQL);

    $rows = array();
    while($r = mysql_fetch_assoc($res)) {
        print $r['x'] . ','
        . $r['y']
        . ','
        . $r['type']
        . ','
        . $r['name']
        . ','
        . $r['text']
        .  ';';
    }

};
mysql_close($db_handle);

リセット: (EDIT 2)

mysql_query("LOCK TABLES bodies WRITE;");

$SQL = " DELETE FROM bodies";

if (!mysql_query($SQL))
  {
  die('Error: ' . mysql_error());
  }
};

mysql_query("UNLOCK TABLES;");
4

1 に答える 1

1

MySQL でトランザクションを実行する方法。

あなたのケースでは、トランザクションの原子性と分離に関心があるかもしれません。つまり、ゲームを再起動するときに、リセットが完全に終了しない前に誰も中間データを取得できないようにしたいということです。トランザクション内でリセットを行うと、このプロパティが保証されます*。(* TRUNCATE については以下を参照)

トランザクションに関係するすべてのテーブルのエンジンとして InnoDB が必要になります。MyISAM はトランザクションをサポートしていません。

トランザクション内で大量のデータを変更すると、クエリの遅延が大きくなる可能性があります。これは、トランザクションで行ったすべての操作を元に戻すことができるように、トランザクションが特別な取り消し/やり直しログを使用するためROLLBACKです。

新しいゲームを始めるとき、私はテーブルを拭きません。代わりに、データに a を与え、新しいゲームを開始するときにgame_idnew を使用します。game_idスペースは、今日では本当に問題になるべきではありません。これには、ゲームをリセットするときに テーブルをロックする必要がほとんどないという利点があります。

必要TRUNCATEに応じて、テーブルをクリアするときに必ず使用してください。私の知る限りTRUNCATE、MySQL ではロールバックできないため、トランザクション内で実行しても何の役にも立ちません。

訪問者数が多い場合でも、正しく使用すれば PHP/MySQL は問題なく動作すると思います。xdebugMySQL スロー クエリ ログなどのプロファイリング ツールを使用して、パフォーマンスのボトルネックを追跡し、取り除くことができます。

于 2012-04-11T23:01:28.440 に答える