Последовательное чтение и обновление без блокировки таблицы в MySQL / InnoDB - PullRequest
2 голосов
/ 06 мая 2011

Мне нужно выполнить следующее на MySQL / InnoDB.Предположим, у меня таблица состоит из 3 столбцов (идентификатор, счетчик, статус)

Мне нужно:

  1. Выбрать строки, в которых статус = 0
  2. Обновить ихустановка статуса = 1 и увеличение счетчика на 1
  3. Возвращение выбранного / обновленного идентификатора клиенту

Требования:

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

Что было бы лучшим решением с точки зрения производительности и масштабируемости (работа для большого стола)?

Ответы [ 3 ]

4 голосов
/ 06 мая 2011
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
START TRANSACTION;
SELECT  id
FROM    mytable
WHERE   status = 0
FOR UPDATE;
UPDATE  mytable
SET     status = 1,
        cnt = cnt + 1
WHERE   status = 0;
COMMIT;
1 голос
/ 06 мая 2011

Вы можете выбрать и обновить в одной инструкции, которая должна выполняться атомарно:

UPDATE tbl SET status=1, counter=counter+1 WHERE status=0;

Я не знаю, что вы хотите на шаге 3, так как задействовано более одного идентификатора. Вы хотите таблицу строк идентификатора, как из инструкции SELECT? Если это так, вы можете использовать хранимую процедуру или использовать SELECT ... LOCK IN SHARE MODE

0 голосов
/ 06 мая 2011

Вы можете сделать

SELECT  id
FROM    mytable
WHERE   status = 0
FOR UPDATE;

Затем создать список идентификаторов в вашем программном обеспечении и затем сделать

UPDATE  mytable
SET     status = 1,
        cnt = cnt + 1
WHERE   id IN (...)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...