我有以下PHP代码:
<?php
$host = "localhost";
$username = "root";
$pw = "root";
$db_name = "marketing";
$Connect = mysqli_connect($host, $username, $pw) or die("Couldn't connect to+ MySQL:<0br>" . mysqli_error($Connect) . "<br>" . mysqli_errno($Connect));
$Db = mysqli_select_db($Connect, $db_name)or die("Couldn't select database:<br>" . mysqli_error($Connect). "<br>" . mysqli_errno($Connect));
mysqli_set_charset($Connect, "utf8");
mysqli_autocommit($Connect,TRUE);
$query1 = "select status from cron_statuses where offset = 0";
$res = mysqli_query($Connect, $query1);
$status = mysqli_fetch_assoc($res);
if (!$status['status']){
$query2 = "update cron_statuses set status = 1 where offset = 0";
$res = mysqli_query($Connect, $query2);
//do something
sleep(20);
$query2 = "update cron_statuses set status = 0 where offset = 0";
$res = mysqli_query($Connect, $query2);
}
else{
echo 'cron blocked';
}
?>
状态的默认值=0。如果我运行脚本,它会将状态更新为1,然后休眠20秒,并将状态更新回0。
休眠时,如果脚本在另一个选项卡中运行,我希望状态等于1,并应输入echo cron_block
,但如果其=0,则应与第一个选项卡相同。
如果我使用ENGINE=InnoDB创建一个表并将autocommit设置为FALSE,我可以重现您的情况。这是我的测试代码,除了将autocommit强制设置为FALSE之外,与您的测试代码大致相同:
$dbconn = mysqli_connect("localhost","root","password");
$db = mysqli_select_db($dbconn,"test");
mysqli_autocommit($dbconn,FALSE);
$res = mysqli_query($dbconn,"SELECT status FROM test WHERE offset = 0;");
$status = mysqli_fetch_assoc($res);
if ( $status['status'] == 0 ) {
$res = mysqli_query($dbconn,"UPDATE test SET status = 1 WHERE offset = 0;");
sleep(10);
$res = mysqli_query($dbconn,"UPDATE test SET status = 0 WHERE offset = 0;");
}
因此,请仔细检查您的表是否使用支持事务的存储引擎,以及默认的自动提交设置是什么。
谨致问候,
Ken
这个问题是因为我在带有两个选项卡的同一浏览器(firefox(中运行了相同的脚本。
当我在firefox上运行第一个,在chrome中运行第二个时,行为如我所料。
此外,当在具有不同选项卡的同一浏览器上使用localhost/script.php和其他192.10.1.5/script.php运行第一个时,行为如我所期望的那样进行。
我不知道为什么,但问题不在代码中。