我承认我不是 100% 了解 PDO 和 MySQL 的内部工作原理,所以我将举一个例子让我的问题更清楚。
我正在制作一个相当粗糙的基于浏览器的策略游戏,因为我认为这是一种学习 PHP 和数据库的有趣方式。当我遇到一个相当意外的错误时,我正在对战斗脚本进行错误测试。我使用 Cron Jobs 每分钟调用一个脚本,看起来像这样:
$sql = "从现役军队中选择军队 ID,到达地点 = 0;";
foreach($dbh->query($sql) as $row)
{
battleEngine($row["army_id"]);
}
完成基本计算后(进攻方军队与防守方军队),数据库中的六个表将被更新。我面临的问题是,当我在同一分钟内对同一目标进行多次攻击时,其中一次攻击时不时地获取过时的数据库信息(在一种极端情况下,攻击 #10 获取与攻击 #5 相同的表) .
我猜这是因为脚本比数据库快吗?有没有办法强制 PHP 等到所有相关信息都准备好后再用下一个 $row 重复该函数?
编辑:埃米尔可能是正确的。我不能确定,因为我的 PDO 似乎不可能保持打开足够长的时间让我在 beginTransaction() 和 commit() 之间传递几个语句。但是,脏读似乎很奇怪,因为我将 InnoDB 与“REPEATABLE READ”一起使用。一些谷歌搜索建议 REPEATABLE READ 将使脏读变得不可能。在考虑了一段时间如何杀死自己之后,我选择了破解。现在,我将一个特殊值的 UPDATE 放在我的脚本顶部,另一个放在底部的大批量(大约六个 UPDATE 语句)的末尾。在运行该函数之前,我已经建立了一个 while() 循环来检查该特殊值是否设置为 0。如果不是,它会休眠 0.01 秒并重试。查看输出,while循环平均重复两次,暗示它可能真的有效?它还没有失败,但可能是因为它不是高峰时间。明天我会定期再试一次。我知道没有人关心这一切,但我觉得我应该做这个更新以防万一。=P