我有一个需要在脚本开头写入数据库的php页面。
在计划的mysqldump备份期间,该页面无法访问,因为它正在尝试写入已锁定的表。
在锁定期间,MySql将这些sql更新排队,并在备份完成后,它们会根据需要执行。然而,在备份完成之前,我的php页面才会显示。
但是,由于更新不会向脚本返回任何内容,我希望他们不会在锁定期间挂起我的脚本;我希望有一种方法可以告诉php只是将sql更新发送到mysql并且不用担心确认更新已完成。
我希望php将查询发送到mysql,如果更新未在一秒内完成,则继续执行下一行php。
我在Windows服务器上运行php,所以我知道某种类型的线程不是一种选择。
如果有办法在该查询上设置超时(具体而言),那可能是理想的,但如果超时,我不想完全违背sql update。我仍然希望MySQL在锁定消失后进行处理。
你会推荐什么(考虑到完全删除sql更新不是一个选项)?
答案 0 :(得分:3)
一个解决方案,使用PDO,启动连接超时,开始事务和已锁定的情况,超时将关闭连接并将回滚。
对于PDO中的超时,使用PDO :: ATTR_TIMEOUT。
答案 1 :(得分:3)
对于可能遇到此线程的其他人,我最终写了这个函数来检测表是否被锁定,并且只有在 NOT 锁定时才进行SQL更新:
function isLocked($databaseName,$tableName)
{
$sql = "show open tables from `".$databaseName."` where `table`=`".tableName."` and In_use > 0;";
$result = @mysql_query($sql);
if (mysql_num_rows($result) != 0 )
{
return true;
}
else
{
return false;
}
}
(注意:此函数假定数据库连接已建立)
这很有效,因为我修改了代码,以便下次加载页面时没有锁定就可以最终完成sql更新。
答案 2 :(得分:1)
我认为唯一的方法是将脚本拆分并使用ajax调用, 你可以发送大更新并继续使用不依赖于该进程的脚本的其余部分,如果所有脚本都取决于更新的结果,唯一的方法是进行一个很好的加载......