php - 有没有办法强制 PHP 等待 MySQL 完成事务?

标签 php sql mysql pdo transactions

我承认我不是 100% 了解 PDO 和 MySQL 的内部工作原理,所以我将举一个例子来让我的问题更清楚。

我正在制作一款相当粗糙的基于浏览器的策略游戏,因为我认为这是一种学习 PHP 和数据库的有趣方式。当我遇到一个意想不到的错误时,我正在对战斗脚本进行错误测试。我使用 Cron Jobs 每分钟调用一个脚本,看起来像这样:

$sql = "SELECT army_id FROM activearmy WHERE arrival=0;";

foreach($dbh->query($sql) as $row)
    {

        battleEngine($row["army_id"]);

    }

当基本计算完成后(进攻军队与防守军队),数据库中的六个表被更新。我面临的问题是,当我在同一分钟内对同一个目标进行多次攻击时,其中一次攻击会时不时地获取过时的数据库信息(在一种极端情况下,攻击 #10 获取与攻击 #5 相同的表) .

我猜这是因为脚本比数据库快?有没有办法强制 PHP 等到所有相关信息都准备就绪后再对下一个 $row 重复该函数?

编辑:Emil 可能是正确的。我无法确定,因为我的 PDO 似乎不可能保持足够长的时间让我在 beginTransaction() 和 commit() 之间传递多个语句。但是,脏读似乎很奇怪,因为我将 InnoDB 与“REPEATABLE READ”一起使用。一些谷歌搜索表明 REPEATABLE READ 将使脏读成为不可能。在考虑了一段时间如何自杀之后,我选择了黑客。现在,我在我的脚本顶部放置了一个特殊值的 UPDATE,在底部的大批量(大约六个 UPDATE 语句)的末尾放置了另一个。在运行该函数之前,我设置了一个 while() 循环来检查该特殊值是否设置为 0。如果不是,它会休眠 0.01 秒并重试。查看输出,while 循环平均重复两次,表明它可能真的有效?它还没有失败,但可能是因为现在不是高峰时间。我明天会定期重试。我知道没有人关心这一切,但我觉得我应该进行此更新以防万一。 =P

最佳答案

您所看到的称为“脏读”。使用 InnoDB 并设置 isolation level可序列化。然后将所有查询包装在事务 block 中:

$dbh->beginTransaction();
// run queries
$dbh->commit();

关于php - 有没有办法强制 PHP 等待 MySQL 完成事务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1015622/

相关文章:

PHP MySQL 更新大型数据库时超时

javascript - 带搜索的分页

mysql - mysql连接查询的通用字段

php - 使用 custam 库的 laravel 文件上传

javascript - 获取选择值然后添加到自定义 html 属性

php - PHP-无法创建数组

sql - 如何在 asp.net C# 中的 SQL Server 中获取 YY 格式的年份

php - 从其他网站访问数据以了解客户登录后是否已付款或未付款状态

用于解决数据库中的传递依赖项的 SQL 查询

c# - 将查询结果写入文件