升级到 mysql 5.7 后GET_LOCK停止工作,因为它在 mysql 5.5 上使用并且正如我预期的那样工作。我知道有关GET_LOCK5.7中的更改。作为描述在这里。
当我从 cmd 行执行相同的脚本两次 - 中间有小暂停 - 它按预期工作:第一个获取锁,第二个没有。
当我通过浏览器执行相同的 php 脚本两次时 - 中间有小暂停 - 都返回他们成功获取锁。这个结果不是我所期望的,它与 5.5 版以及我对GET_LOCK5.7 文档中描述的理解不同。
这是示例脚本locktest.php:
<?php
$host = 'localhost';
$db = 'enter_your_db';
$user = 'enter_your_username';
$pass = 'enter_your_password';
$charset = 'utf8mb4';
$dsn = "mysql:host=$host;dbname=$db;charset=$charset";
$opt = [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
PDO::ATTR_EMULATE_PREPARES => false,
PDO::ATTR_PERSISTENT => false
];
$pdo = new PDO($dsn, $user, $pass, $opt);
echo "pid=(".getmypid().")\n";
$stmt = $pdo->query('SELECT connection_id() as connid');
$row = $stmt->fetch();
echo "mysql connection id =(".$row['connid'].")\n";
$stmt = $pdo->query('SELECT GET_LOCK("foobar", 2)');
$row = $stmt->fetch();
var_dump($row);
echo "\n\n";
sleep(10);
Run Code Online (Sandbox Code Playgroud)
当这个脚本从 cmd 行运行时——我得到了我所期望的:从一个终端运行 php -q locktest.php。然后立即从另一个终端窗口。
第一个将返回:
pid=(18378)
mysql connection id =(71)
array(1) {
["GET_LOCK("foobar", 2)"]=>
int(1)
}
Run Code Online (Sandbox Code Playgroud)
(请注意,GET_LOCK结果为 1)
第二个将返回(在第一个仍在运行时启动):
pid=(18393)
mysql connection id =(73)
array(1) {
["GET_LOCK("foobar", 2)"]=>
int(0)
}
Run Code Online (Sandbox Code Playgroud)
(请注意,GET_LOCK结果为 0 - 正如预期的那样,并且 pid 和 mysql 连接 ID 不同)。
当同一个脚本从浏览器启动两次时——它报告两个脚本都成功获得了锁。第一次返回:
pid=(11913) mysql 连接 id =(74) array(1) { ["GET_LOCK("foobar", 2)"]=> int(1) }
第二次返回(当第一个仍在运行时):
pid=(11913) mysql connection id =(75) array(1) { ["GET_LOCK("foobar", 2)"]=> int(1) }
请注意,pids 相同,但 mysql 连接 id 不同,GET_LOCK结果与预期不同,因为两者都返回 1。
现在我很困惑。使用了不同的 mysql 连接(由CONNECTION_ID()返回),这表明不同的 mysql 会话。根据 mysql 文档,可以从SAME会话中获得更多同名的锁,但是这里我有不同的 mysql 会话,对吗?
我什至把PDO::ATTR_PERSISTENT => false虽然这是一个默认值。
cmd 行和浏览器的输出之间的唯一区别是 pid(来自 cmd 行的两个执行的 php 脚本的不同 pid,以及来自浏览器的两个执行的 php 脚本的相同 pid)。
任何想法发生了什么?现在,对我来说,这似乎是一个主要问题,因为锁定已悄然停止工作。:(
谢谢。
| 归档时间: |
|
| 查看次数: |
1094 次 |
| 最近记录: |