MySQL таблица заблокирована после сбоя php - PullRequest
2 голосов
/ 02 марта 2011

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

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

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

Любые идеи ??

Ответы [ 3 ]

6 голосов
/ 02 марта 2011

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

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

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

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

3 голосов
/ 02 марта 2011

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

- Джошуа

0 голосов
/ 02 марта 2011

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

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

...