Управление версиями SQL-запроса
У меня есть ферма серверов, каждый сервер регулярно делает идентичный запрос к базе данных. Эти результаты запроса кэшируются в общем кэше, доступном для всех серверов.
Как я могу гарантировать, что новый запрос не будет перезаписан более старым запросом? Есть ли способ как-то управлять версиями запросов, например, по времени, чтобы этого не произошло? Как бороться с параллельными запросами?
Спасибо!
Изменить: БД является SQL Server. Запрос является оператором выбора. И механизм кэширования очень прост: простая запись, без блокировки. И это потому, что в настоящее время нет способа определить порядок запросов select.
2 ответа
Один из подходов заключается в том, чтобы иметь глобальный счетчик обновлений в базе данных, либо для обновлений, либо для чтения (обновления более эффективны, но и сложнее получить правильные данные).
Поэтому при каждом обновлении также увеличивайте глобальный счетчик. При каждом чтении считывайте глобальный счетчик и помещайте данные в кэш вместе со значением счетчика. Перезаписывать содержимое кэша только в том случае, если значение счетчика больше.
Из-за изоляции базы данных транзакции должны выглядеть так, как если бы они происходили последовательно (при условии, что вы выбрали уровень изоляции SERIALIZABLE). Это, в свою очередь, будет означать, что строго более высокие значения счетчиков относятся к более свежим данным.
Где находится кеш? Это файл на диске? Или таблица в базе данных?
И что это значит, когда вы говорите, что старый запрос может перезаписать более новый? Разве не правда, что самый последний завершенный запрос (или, может быть, самый последний запущенный) является самым новым?
Вы должны заблокировать контейнер кеша перед выполнением каждого запроса, будь то файл или таблица. Каждый сервер должен выполнять запрос только в том случае, если он может получить блокировку, в противном случае он должен ожидать заблокированный ресурс. Таким образом, кэш будет содержать только самые последние результаты.
Это соответствует тому, что вы спрашиваете?