3

我有一个包含大量游戏对象的数据库,以下 3 个 PHP 脚本正在查询这些对象。

  1. 列出对象:获取包含我需要的所有项目的 JSON 对象
  2. 添加对象:将对象添加到数据库中
  3. 重置:擦除桌子上的所有对象

他们三个都在某种程度上起作用。虽然,时间不匹配。当游戏调用重置函数时,它会重新启动。当游戏重新启动时,它会自动加载所有对象。不幸的是,这里的问题是,如果游戏刚刚被重置,对象仍然会被脚本 1 拉取。

我知道事务,但我从未使用过它们,也不知道如何在这里实现它们,因为我的事务涉及来自在不同时间运行的不同脚本的事物。

奖励积分:这个设置(AS3 > php > MySQL)会让我在繁重的负载中遇到麻烦吗?游戏可能会被 10、100、1000 人接受,关于这个主题我能读到什么吗?

编辑:新想法/问题

目前,擦除工作如下:对象表有一个字段“已删除”,当调用重置方法时,该字段设置为“1”。将现有数据复制到存档表中然后截断活动表可能更聪明......

编辑:这是我正在使用的(相关)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);

重置:(编辑 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 中进行事务处理。

在您的情况下,您可能对事务的原子性和隔离性感兴趣,这意味着在重新启动游戏时,您希望确保在重置尚未完全完成之前,没有人可以获取您的任何中间数据。在事务中进行重置将确保此属性*。(*截断见下文)

对于事务中涉及的所有表,您将需要 InnoDB 作为引擎。MyISAM 不支持事务。

更改事务中的大量数据可能会导致高查询延迟,因为事务使用特殊的撤消/重做日志能够撤消您在事务中所做的所有事情,如果您决定这样做的话ROLLBACK

开始新游戏时我不会擦桌子。而是在开始新游戏时给你的数据一个game_id并使用一个新的。game_id如今,空间不应该成为真正的问题。这样做的好处是您在重置游戏时 几乎不需要锁定桌面。

如果必须,请务必TRUNCATE在清理桌子时使用。据我所知TRUNCATE,在 MySQL 中无法回滚,因此在事务中执行它不会做任何有用的事情。

我认为如果使用得当,PHP/MySQL 会表现良好,即使对于更大的访问者数量也是如此。您可以使用xdebugMySQL 慢查询日志等分析工具来跟踪和消除性能瓶颈。

于 2012-04-11T23:01:28.440 回答