The*_*ore 5 php mysql sql pdo transactions
我承认我不是百分之百地讨论PDO和MySQL的内部工作原理,所以我举一个例子让我的问题更清楚.
我正在制作一个相当粗糙的基于浏览器的策略游戏,因为我认为这是一种学习PHP和数据库的有趣方式.当我遇到一个意想不到的错误时,我正在对战斗脚本进行错误测试.我使用Cron Jobs每分钟调用一个脚本,看起来像这样:
$ sql ="SELECT army_id FROM activearmy WHERE arrival = 0;";
foreach($dbh->query($sql) as $row)
{
battleEngine($row["army_id"]);
}
Run Code Online (Sandbox Code Playgroud)
当完成基本计算(攻击军队与防御军队)时,数据库中的六个表格将被更新.我面临的问题是,当我在同一分钟内对同一目标进行多次攻击时,这些攻击中的一个偶尔会获取过时的数据库信息(在一个极端情况下,攻击#10取得与攻击#5相同的表) .
我猜这是因为脚本比数据库快?有没有办法强制PHP等到所有相关信息都到位后才重复下一个$行的函数?
编辑:埃米尔可能是正确的.我无法确定,因为我的PDO似乎不可能保持打开足够长的时间让我在beginTransaction()和commit()之间传递几个语句.但是,脏的读取看起来很奇怪,因为我正在使用InnoDB和"REPEATABLE READ".一些谷歌搜索建议REPEATABLE READ将使脏读不可能.在考虑如何自杀一段时间之后,我选择了一个黑客.现在,我在我的脚本上添加了一个特殊值的UPDATE,在底部的大批量(大约六个UPDATE语句)末尾添加了另一个值.在运行该函数之前,我已经设置了一个while()循环来检查该特殊值是否设置为0.如果不是,它会休眠0.01秒并再次尝试.查看输出,while循环平均重复两次,表明它可能实际上正在工作?它还没有失败,但可能是因为它不是高峰期.我明天会定期再试一次.我知道没有人关心这一切,但我觉得我应该做这个更新以防万一.= P
如果 PHP 完全等待,您将会收到大量的 cron 作业。
您真正想要的是使用 anachron 之类的东西,以确保在任何给定时刻只有一个脚本实例运行。您也可以执行类似以下操作:
<?php
if (file_exists('/tmp/myscriptlock')) exit();
touch('/tmp/myscriptlock');
// do your stuff
unlink('/tmp/myscriptlock');
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5543 次 |
| 最近记录: |