mysql 5.7。GET_LOCK 不再起作用

Dam*_*irR 6 php mysql apache

升级到 mysql 5.7 后GET_LOCK停止工作,因为它在 mysql 5.5 上使用并且正如我预期的那样工作。我知道有关GET_LOCK5.7中的更改。作为描述在这里

当我从 cmd 行执行相同的脚本两次 - 中间有小暂停 - 它按预期工作:第一个获取锁,第二个没有。

当我通过浏览器执行相同的 php 脚本两次时 - 中间有小暂停 - 都返回他们成功获取锁。这个结果不是我所期望的,它与 5.5 版以及我对GET_LOCK5.7 文档中描述的理解不同。

  • PHP 作为模块运行(phpinfo() 显示 Server API: Apache 2.0 Handler )。
  • PHP 版本为:7.0.20
  • Mysql 版本是:5.7.18 OS 是
  • CentOS 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)。

任何想法发生了什么?现在,对我来说,这似乎是一个主要问题,因为锁定已悄然停止工作。:(

谢谢。