Кэшированные вставки MySQL - Сохранение целостности данных - PullRequest
0 голосов
/ 29 марта 2011

Я хотел бы сделать много вставок, но можно было бы через некоторое время обновить mysql.

Например, если есть запрос, такой как

Update views_table SET views = views + 1 WHERE id = 12;

Может быть невозможно сохранить этот запрос до тех пор, пока число представлений не достигнет 100, а затем выполнить следующий запрос вместо выполнения запроса свыше 100 раз.

Update views_table SET views = views + 100 WHERE id = 12;

Теперь, допустим, что это сделано, тогда возникает проблема целостности данных. Допустим, открыто 100 php-файлов, которые собираются выполнить один и тот же запрос. Теперь, если нет механизма блокировки приращения кэшированных представлений, существует вероятность того, что несколько файлов могут иметь одинаковое значение кэшированного представления, поэтому предположим, что процесс 1 может иметь 25 кэшированных представлений, а процесс php 2 может иметь 25 просмотров и процесс 3 может иметь 27 просмотров из файла. Теперь предположим, что процесс 3 завершает работу и увеличивает счетчик до 28. Затем предположим, что процесс php подходит к концу, и он завершился сразу после процесса 3, что означает, что счетчик будет сброшен до 26.

Итак, у вас, ребята, есть какие-нибудь решения, которые быстра, но также надежны и для данных.

Спасибо

Ответы [ 2 ]

2 голосов
/ 29 марта 2011

Пока ваши запросы используют относительно значений views=views+5, должно быть без проблем .

Только если вы сохраните значение где-то в своем скрипте, а затем рассчитаете новое значение самостоятельно, у вас могут возникнуть проблемы. Но почему вы хотите это сделать? На самом деле, , почему вы хотите сделать все это в первую очередь? :)

Если вы не хотите перегружать базу данных, вы можете использовать UPDATE LOW_PRIORITY table set ..., ключевое слово LOW_PRIORITY поместит действие обновления в очередь и будет ждать, когда таблица больше не будет использоваться. читает или вставляет.

0 голосов
/ 29 марта 2011

Прежде всего: с этими запросами: независимо от того, когда процесс запускается, UPDATE .. SET col = col + 1 является безопасной операцией, поэтому он никогда не «уменьшит» счетчик.

Относительно ' сохраняйте этот запрос до тех пор, пока количество представлений не достигнет 100, а затем выполните следующий запрос вместо 100-кратного выполнения запроса ': не совсем.Вы можете хранить счетчик в более быстрой памяти (на ум приходит memcached), с процессом, который время от времени передает его в базу данных, или сохранять в другой таблице с помощью триггера AFTER UPDATE, но я не вижуТочка делать это.

...