Задавайте вопросы, мы ответим
Вы не зашли.
Добрый день!
столкнулся с такой проблемой
есть таблица
Неактивен
Странно, теоретически, update и select должны следовать одинаковому плану. Попробуйте использовать FORCE INDEX. Обходной вариант - делать сначала SELECT, а потом UPDATE с условием типа id IN (,,,) или с использованием временной таблицы для хранения результатов SELECT.
Неактивен
rgbeast написал:
Странно, теоретически, update и select должны следовать одинаковому плану. Попробуйте использовать FORCE INDEX. Обходной вариант - делать сначала SELECT, а потом UPDATE с условием типа id IN (,,,) или с использованием временной таблицы для хранения результатов SELECT.
тут фигня в том что update должен выполнится как атомарная операция.
при выполнении update 10 лучших записей с минимальной датой лочатся (lock=1) и им выставляется некий уникальный сигн.
А потом зная сигн, я просто выбираю залоченные записи и с ними спокойно работаю.
если разбить update на две фазы - выборку и далее update, то когда зайдут несколько клиентов и одновременно попытаются получить задачи, у них может возникнуть коллизия и они получат одинаковые строки.
вот кстати вопрос
если сделать так, получится ли "развести" клиентов и избежать наложений?
start transaction;
select some_rows for update;
update schedule where id in some_rows;
commit;
Неактивен
С транзакцией можно избежать наложений, но:
1) нужно использовать высокую степень изоляции (SERIALIZABLE)
2) нужно быть готовым, что транзакция может откатиться с ошибкой (в этом случае ее можно просто повторить)
Можно использовать явную блокировку таблицы: http://webew.ru/articles/1383.webew
Неактивен
оформил как баг, думаю поправят
https://mariadb.atlassian.net/browse/MDEV-4410
Неактивен
Порадовало, что быстро ответили. Пишите здесь как решится судьба бага.
Неактивен