Здравствуйте, не могу найти решение своей проблемы.
Таблица innodb
В качестве движка для mysql пробовал mysqli и PDO, результат один и тот же
Имеются php скрипты, каждый делает примерно вот что:
в цикле, проходит по списку ид записей из таблицы
1) стартует в мускуле новую транзацию
2) делает select * where id=xxx for update
3) делает или не делает update
4) делает commit или rollback
5) стартует новую транзакцию
..
В классе в __destruct() стоит явный commit
И вот ту начинается засада, второй скрипт, запущенный вскоре после первого почему то начинает тупить и ждать 50 секунд.
Начинаю копать, это время 50 сек - дефолтное значение innodb_lock_wait_timeout
Т.е., как будто commit применяет изменения, но запись остается все еще залоченной, пока не истечет таймаут.
Пробовал после commita делать реконнект - не помогает
А вот если второй скрипт запускается после того, как первый успел выполнится - проблем нет. Т.е. окончательно запись разлочивается только после закрытия php-скрипта или таймаута
Проверил интерлоки, на предмет того, что в первом скрипте лочатся например запись id=1, потом во втором id=2,3 , а потом первый скрипт пытается залочить id=2 - интерлоков нет.
Сделал логирование всех цепочек запросов, повторяю их тупо в мускуле - все работает.
Т.е. в одном окне сделал select for update, потом его же во втором окне, потом в первом делаю commit - и во втором запрос сразу же проходит, ничего не ждет.
Подскажите, куда копать? На буржуйских форумах ответ найти не могу, там какие-то упрощенные ответы. (Отредактировано автором: 09 Декабря, 2015 - 14:23:35)
|