Oracle материализовал представление обновлений доступности данных
В приложении с материализованными представлениями Oracle мне интересно узнать о доступности данных во время обновления.
Я опишу потенциальный пример.
Создается материализованное представление, которое обновляется каждый час. Запрос выполняется в течение 1 минуты, чтобы обновить это представление. Тем временем ряд API использует это представление для извлечения данных и потенциально может записывать в базовую таблицу, если это имеет значение.
Мои вопросы следующие?
- Что происходит с запросами в течение этого 1-минутного обновления, они заблокированы? Они получают старую копию данных?
- То, что происходит с записями в базовые таблицы в это время, влияет на них каким-либо образом.
- Что если активный запрос поступает в 2:59:59 и выполняется в течение 30 секунд в материализованном представлении, блокирует ли это представление, и обновление не запускается до 3:00:29, или этот запрос прерывается и приостанавливается обновлением?
Если требуется какое-либо разъяснение, пожалуйста, дайте мне знать.
Спасибо!
1 ответ
Правила для того, что запросы данных видят в материализованном представлении, идентичны правилам, которые применяются к тому, что запросы данных видят в таблице, в которой происходят изменения. Эти правила обобщены в документации по согласованности многоверсионного чтения.
Я предполагаю, что вы делаете атомное обновление материализованного представления. Вы могли бы сделать неатомарное обновление, которое урезало бы материализованное представление перед обновлением, но это почти наверняка не то, что вы хотели бы в этом случае.
- Запросы будут видеть данные в том виде, в каком они существовали при запуске запроса (или когда транзакция началась, если сеанс находится в уровне изоляции сериализуемой транзакции). Таким образом, перед началом обновления будет отображаться согласованная картина данных.
- Считыватели не блокируют записи, так что это не повлияет на запись в базовую таблицу.
- Как и 1, запрос будет видеть непротиворечивую картину данных в том виде, в каком они существовали, когда запрос начал выполняться (или когда транзакция началась). Обновление будет выполняться одновременно только в отдельной области транзакции. Единственное влияние состоит в том, что запрос потенциально может быть немного медленнее, поскольку, вероятно, потребуется применить некоторое количество UNDO к текущим кэшированным блокам, чтобы вернуть данные в том виде, в каком они существовали на момент начала запроса.