Deadlock при сортировке результата выборки

313
25 июня 2017, 14:59

Имеется запрос, выполняемый параллельно множеством потоков в собственных транзакциях:

SELECT `account_id` FROM `accounts`
WHERE `request_mts` < :request_mts
ORDER BY `request_mts` ASC
LIMIT 1 FOR UPDATE

...где "account_id" - первичный ключ, а ":request_mts" - число миллисекунд.

Этот запрос часто приводит к дедлокам:

Deadlock found when trying to get lock; try restarting transaction

QMYSQL3: Unable to store statement results

Проблема, как удалось выяснить, связана с сортировкой выборки. Если сортировку из запроса убрать, то дедлоки более не возникают:

SELECT `account_id` FROM `accounts`
WHERE `request_mts` < :request_mts
LIMIT 1 FOR UPDATE

Есть ли способ сохранить сортировку, но при этом избежать и дедлоков?

Дополнено

После выполнения выборки (если был найден подходящий account_id) идёт запрос на обновление колонки request_mts в той же транзакции, что и выборка. После этого транзакция закрывается.

UPDATE `accounts` SET `request_mts` = :request_mts
WHERE `account_id` = :account_id
READ ALSO
Ошибка БД при установке MODx

Ошибка БД при установке MODx

Пытаюсь связать базу данных и MODx, но вылазит такая ошибкаВ чем может быть проблема? В интернете нет особо информации про это, в правильности...

332
Как в одном запросе получить значение ячейки таблицы и сразу изменить его?

Как в одном запросе получить значение ячейки таблицы и сразу изменить его?

Я храню счетчик в таблице, мне нужно узнать его значение и увеличить на 1, но чтобы в этот процесс никто не вклинилсяПодскажите как такое реализовать?

238
Запись в MySQL из БД Firebase

Запись в MySQL из БД Firebase

На сервере стоит php70 apache2 mysql, firebase-admin-SDK на php : https://firebase-php

231