2016-06-11 5 views
0

Речь идет о поведении одновременного ВЫБРАТЬ и UPDATE в MySQL InnoDB таблице:MySQL MVCC (InnoDB)

У нас есть относительно большой стол, который мы периодически сканировать чтения нескольких полей, включая поле с именем, скажем, LastUpdate. Во время сканирования мы обновляем ранее проверенные строки. Обновления группируются и выполняются в фоновом потоке - с использованием другого соединения. Важно отметить, что мы обновляем строки, которые уже были прочитаны.

Три вопроса:

  1. Will InnoDB будет сохранять предыдущие версии обновленных строк, так как SELECT, все еще продолжается?
  2. Будет ли использовать READ-UNCOMMITTED для справки SELECT?
  3. Как я могу подтвердить, что InnoDB сохраняет или не сохраняет предыдущие версии измененных строк в своем повторном журнале.

ответ

1

Игнорировать проблему, и писать код, который не получит неприятности:

BEGIN; 
SELECT id ... LIMIT 20; -- get list of _possible_ candidates for action 
COMMIT; 
** 
foreach $candidate 
    BEGIN; 
    SELECT ..., is_candidate WHERE id = $candidate FOR UPDATE; 
    if still a candidate 
     process it 
     UPDATE ...; 
    COMMIT; 

Если кто-то скользит, скажем, на **, чек позже будет предотвратить двойную обработку. Кроме того, второй BEGIN..COMMIT не позволяет кому-либо соскользнуть.

FOR UPDATE «блокирует» ряд; это важно.

Преимущество обработки таким образом заключается в том, что операции быстро, тем самым минимизируя влияние на все остальное.

+0

Не уверен, что я понимаю ответ. Оператор SELECT в моем случае потенциально возвращает * лот * строк (100 000 и более). Вопрос в том, могу ли я как-то сказать MySQL, что я закончил обработку первых 1000 строк, и нет необходимости хранить старые версии этих строк во время их обновления. – nimrodm

+0

Возможно, единственный способ - разбить его на кусты. –

+0

Ну, использование LIMIT/OFFSET очень неэффективно, и использование курсора выборки сервера заставляет MySQL создавать временную таблицу, что снова означает копирование всех данных. Возможно, разбивка на первичный ключ будет работать лучше всего. Благодаря! – nimrodm