Усечение таблицы MEMORY и блокировка - PullRequest
1 голос
/ 22 сентября 2009

Я использую таблицу памяти из 1 столбца для отслеживания просмотров различных элементов в моей БД. Каждый просмотр = INSERT-запрос в таблицу памяти. Каждые 10 минут я хочу считать () строки для каждого элемента и фиксировать изменения в БД.

Вопрос в том, .... если я выполню запрос, который получит список всех элементов, например

SELECT COUNT(*) AS period_views, `item_id` FROM `-views` GROUP BY `item_id` ORDER BY `item_id`

, а затем запустите запрос на обновление для каждой строки, чтобы добавить количество просмотров за этот период, а затем обрежьте таблицу. Эта операция может занять несколько секунд .... и в эти несколько секунд в эту таблицу будут добавлены другие ВСТАВКИ, которые не попадут в исходный счет. Будут ли они тоже усечены после выполнения этой команды? или таблица будет заблокирована до завершения всей операции и добавления новых INSERT?

1 Ответ

0 голосов
/ 22 сентября 2009

MySQL не блокирует таблицу автоматически, и возможно, что вы потеряете некоторые записи между получением счетчика и выполнением усечения. Таким образом, два решения выскакивают у меня:

1) Используйте блокировки таблиц для предотвращения обновления таблицы памяти - в зависимости от характера вашего приложения это означает, что все ваши клиенты могут зависать на несколько секунд во время обновления, это может быть в порядке.

2) Добавьте второй столбец , чтобы отслеживать, какие записи вы в настоящее время обновляете ...

ALTER TABLE `-views` ADD work_in_progress TINYINT NOT NULL DEFAULT 0;

А потом, когда вы захотите поработать над этими записями

UPDATE `-views` SET work_in_progress = 1;
SELECT COUNT(*) AS period_views, `item_id` FROM `-views` WHERE work_in_progress GROUP BY `item_id` ORDER BY `item_id`;
# [ perform updates as necessary ]
DELETE FROM `-views` WHERE work_in_progress;

Эта реализация гарантирует, что вы не удалите -views, которые были добавлены во время обновления.

И FWIW, -views - это ужасное имя для таблицы!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...