PHP mysql блокировка записи не позволяет обновить базу данных. Соединение, которое блокирует, должно быть в состоянии обновить - PullRequest
1 голос
/ 03 мая 2019

Я пытаюсь заблокировать (ЗАПИСАТЬ) таблицу в базе данных, и пока она заблокирована, я хочу обновить какое-то поле и затем разблокировать таблицу. Кажется, что когда я блокирую таблицу, соединение, в котором заблокирована таблица, также блокируется. Но смысл блокировки WRITE состоит в том, чтобы отключить другие соединения, но не те, которые выполняют блокировку. Я пробовал использовать mysqli и PDO, но, похоже, ничего из этого не работает.

Я тоже пытался напрямую в phpmyadmin, и он отлично работает.

Я использую PHP 5.6 и расширения mysqli / PDO. Если я выполню это непосредственно в phpmyadmin, чем это работает:

LOCK TABLE `catalogue_user` WRITE;
UPDATE `catalogue_user` SET update_time = NOW() WHERE catalogue_user_id = 5;
SELECT SLEEP(10);
SELECT NOW();

Мне нужно обновить update_time сразу после блокировки (в то время как другие не могут получить доступ к таблице)

try {
        $conn = new PDO("mysql:host=". DB_HOST .";dbname=". DB_DBNAME, DB_USER, DB_PASS);
        // set the PDO error mode to exception
        $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        echo "Connected successfully";

        var_dump(date("H:i:s"));

        $conn->exec("LOCK TABLE ". DB_TABLE_CATALOGUE_USER ." WRITE;");
        $conn->exec("UPDATE ". DB_TABLE_CATALOGUE_USER ." SET update_time = '". date("H:i:s") ."' WHERE catalogue_user_id = 5");

        sleep(10);

        $conn->exec("UNLOCK TABLES;");

        var_dump(date("H:i:s"));

      }
      catch(PDOException $e)
      {
        echo "Connection failed: " . $e->getMessage();
      }

Я искал повсюду возможные подсказки, но ни один из них не работал ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...