powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Lock wait timeout exceeded; try restarting transaction
5 сообщений из 5, страница 1 из 1
Lock wait timeout exceeded; try restarting transaction
    #39254325
comalex3
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть следующий запрос, в котором ,я ожидал, что будет выбираться одна запись браться блокировка, опять же на одну запись, ставить флаг - используется и отпускать блокировку на эту запись, но судя по ошибке
Код: sql
1.
'Lock wait timeout exceeded; try restarting transaction'

, блокировка береться всей таблицы, а так как у меня процессов 300 одновременно пытаются получить запись с этой таблицы, это очень плохо.
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
             begin;
            SELECT GetDistance('newhaven', area) as distance, id = (SELECT @proxy_id := id) from checkins
                WHERE last_checkin > DATE_SUB(NOW(), INTERVAL 5 MINUTE)
                  AND active  = 1
                  AND offline = 0
                  AND usage_flag = 0
             ORDER BY distance ASC, RAND() limit 1 FOR UPDATE;
             UPDATE checkins set usage_flag=1 where id=@proxy_id;
             commit;


Прошу совета, как лучше организовать данное дело.
Спасибо.
...
Рейтинг: 0 / 0
Lock wait timeout exceeded; try restarting transaction
    #39254442
netwind
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
comalex3, не так то просто эту ошибку увидеть. Чую запрос у вас лишних страниц блокирует, а может и всю таблицу. Но это надо доказать.
...
Рейтинг: 0 / 0
Lock wait timeout exceeded; try restarting transaction
    #39254443
netwind
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а! вы сами уже пришли к этом выводу . Это хорошо.
Теперь посмотрите explain выбирающего запроса , оптимизируйте его и, возможно, все наладится.
...
Рейтинг: 0 / 0
Lock wait timeout exceeded; try restarting transaction
    #39254456
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
comalex3
Код: sql
1.
id = (SELECT @proxy_id := id)

Не могу объяснить почему, но мне не нравится эта конструкция. Хотя, конечно, в блокировках виновата не она.
comalex3
Код: sql
1.
ORDER BY distance ASC, RAND()

Зачем тут нужен RAND() ?
Скорости выполнения он явно не добавляет.

А вообще я бы пошел другим путем - сразу бы апдейтил нужную запись, без SELECT ... FOR UPDATE.
...
Рейтинг: 0 / 0
Lock wait timeout exceeded; try restarting transaction
    #39254465
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
comalex3судя по ошибке
Код: sql
1.
'Lock wait timeout exceeded; try restarting transaction'


, блокировка береться всей таблицы
Не, а что ты хотел? или ты наивно полагаешь, что UPDATE тебе будет обновлять только ту строку, которая была выбрана в SELECT? так вот ни хрена...
Сперва у тебя выполняется SELECT ... FOR UPDATE. В нём ты выбираешь одну запись - она в полном соответствии с документацией блокируется на запись. А потом у тебя идёт UPDATE, но не той самой одной заблокированной записи, а всех записей, которые соответствуют условиям отбора запроса. Ну и запрос в рамках транзакции блокирует их все. А ты любуешься текстом ошибки.
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Lock wait timeout exceeded; try restarting transaction
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]