таблица mysql заблокирована после сбоев php

У меня есть БД MySQL и таблица innoDB. У меня есть страница php, которая соединяет, блокирует таблицу, выполняет некоторые обновления, а затем разблокирует таблицу. Страница PHP обрабатывается с помощью apache через wamp.

Страница php загружает файл в базу данных. Я решил имитировать сбой системы, загрузив файл с размером, большим, чем память, выделенная для PHP. Это определенно вызвало эту ошибку: допустимый объем памяти 18874368 байт исчерпан (пытался выделить 6176754 байта). После этого таблицы, которые были заблокированы во время обновлений, по-прежнему заблокированы.

Ошибка, которую я получаю, когда пытаюсь получить доступ к таблицам после этой ошибки: Таблица «a» не была заблокирована с помощью LOCK TABLES. Я знаю, что это проблема блокировки, потому что я вызову SQL-запрос и попытаюсь выбрать из таблицы, которая была заблокирована, и она просто ждет, точно так же, как и при блокировке таблицы. Если я затем убью процесс Apache, то утверждение, которое я попытался запустить в SQL-запросе, наконец, пройдет. Я предполагаю, что когда я убиваю процесс Apache, MySQL понимает, что блокировка таблицы должна быть освобождена из-за разъединения соединения.

Есть идеи??

Qoute от: http://dev.mysql.com/doc/refman/5.0/en/lock-tables.html

Если соединение для клиентского сеанса завершается, как обычно, так и ненормально, сервер неявно освобождает все блокировки таблицы, удерживаемые сеансом (транзакционные и без транзакции). Если клиент повторно подключится, блокировки перестанут действовать. Кроме того, если клиент имел активную транзакцию, сервер откатывает транзакцию при отключении, а если происходит повторное подключение, новый сеанс начинается с включенной автокоммиссии.

Поскольку ваше соединение является постоянным после того, как страница выполнила и завершила / удалила соединение, все еще присутствует.

Вы не должны устанавливать постоянное соединение IMO

Хорошо, поэтому, прочитав мой пост, я понял, что я ответил на свой вопрос. Соединение продолжалось даже после сбоя, потому что я использовал mysql_pconnect () для подключения к базе данных. Я изменил его на mysql_connect (), и он работал отлично. Извините, если я потратил время, но надеюсь, что это поможет кому-то!

–Джошуа

Вы можете использовать функцию выключения для разблокировки таблиц:

http://php.net/manual/en/function.register-shutdown-function.php