LINUX.ORG.RU

[mysql][InnoDB] SELECT ... FOR UPDATE и LIMIT


0

0

Привет всем!

Использую запрос примерно такого вида:

Select * From mytable Where IsIndexed = 0 OR PagesCheckDate=0 OR DATE_ADD(PagesCheckDate,interval 2 week) < NOW() ORDER BY IsIndexed ASC, PagesCheckDate DESC LIMIT 1 FOR UPDATE;

При выполнении запроса из консольного клиента - все ок. Если же запускаю скрипт, в котором выполняется этот запрос - получаю "Lock wait timeout exceeded; try restarting transaction".

Обгуглился уже, не могу найти решения.

Сколько на самом деле строк обрабатывает этот запрос (не смотря на LIMIT 1)?

Может кто сталкивался с подобным.

P.S. Таблицу в этот момент никто больше не исполузует.

Re: [mysql][InnoDB] SELECT ... FOR UPDATE и LIMIT

Отвечаю сам себе: выяснить точно, почему с LIMIT запросы на SELECT ... FOR UPDATE работать не хотят, не вышло.

Но как минимум, при использовании LIMIT нет возможности делать блокирующие селекты.

Сделал так: добавил в таблицу поле pid, в которое каждый скрипт при выборе нужных ему строк, пишет свой PID. После работы это поле обнуляется.

Таким образом строки одного процесса не сможет захватить никто другой.

it-partizan ()

Re: [mysql][InnoDB] SELECT ... FOR UPDATE и LIMIT

что-то очень знакомое, возможно нужно выставить значение timeout в конфиге побольше и убедиться что индексы есть по всем полям

xtron ()

Re: [mysql][InnoDB] SELECT ... FOR UPDATE и LIMIT

>Сколько на самом деле строк обрабатывает этот запрос (не смотря на LIMIT 1)?

Да все походу, не умеет mysql нормально order by с limit компоновать.
Сделай теневую таблицу куда как в архив сливай старые данные из рабочей чтобы в ней было поменьше записей и запрос меньше тормозил или слезай с mysql, скажем на postgresql

xtron ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.