Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Висящая транзация

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Описание: вопрос по локу записи в innodb
zTaunTz
Отправлено: 09 Декабря, 2015 - 13:51:20
Post Id


Новичок


Покинул форум
Сообщений всего: 2
Дата рег-ции: Дек. 2015  
Откуда: Санкт-Петербург


Помог: 0 раз(а)




Здравствуйте, не могу найти решение своей проблемы.

Таблица 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)

 
My status
 Top
Faraon-san
Отправлено: 09 Декабря, 2015 - 16:11:45
Post Id



Посетитель


Покинул форум
Сообщений всего: 318
Дата рег-ции: Сент. 2013  


Помог: 8 раз(а)




Попробуй явно удалить unset объект где commit прописан.
 
 Top
zTaunTz
Отправлено: 10 Декабря, 2015 - 18:39:53
Post Id


Новичок


Покинул форум
Сообщений всего: 2
Дата рег-ции: Дек. 2015  
Откуда: Санкт-Петербург


Помог: 0 раз(а)




Faraon-san пишет:
Попробуй явно удалить unset объект где commit прописан.

Пробовал, не помогает. Запись анлочится только при завершении скрипта
 
My status
 Top
Мелкий Супермодератор
Отправлено: 10 Декабря, 2015 - 20:20:44
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




Пока висит скрипт выполните SHOW ENGINE INNODB STATUS
Там должно быть указано кто и что ждёт.

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


-----
PostgreSQL DBA
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« SQL и Архитектура БД »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB