Операция записи
Содержание раздела
Операция записи — действие по сохранению изменений данных в логической таблице или материализованном представлении.
Система создает и обрабатывает операцию записи:
- (в логических таблицах) для каждого запроса на загрузку или обновление данных;
- (в материализованных представлениях) для всех изменений, загруженных в представление в цикле синхронизации.
В логической сущности одновременно может выполняться только одна операция, в разных сущностях операции могут выполняться параллельно.
Операции атомарны: если системе не удалось выполнить какое-то изменение в рамках операции, вся операция отменяется. Система изолирует изменения по операции от изменений по другим операциям и позволяет обращаться к данным отдельной операции.
Операции в дельте и вне дельты
Операции записи можно выполнять в дельте или вне дельты.
Дельта позволяет сгруппировать операции записи и управлять ими как группой, сохраняя или отменяя изменения по всем операциям группы сразу. Если в логической базе данных есть открытая дельта, все операции записи, начатые после ее открытия и завершенные до ее закрытия, попадают в эту дельту. Изменения по операциям записи в дельте становятся доступны для чтения и выгрузки без указания FOR SYSTEM_TIME после закрытия этой дельты.
Операциями вне дельты можно управлять по отдельности, а их изменения становятся доступны для чтения и выгрузки без указания FOR SYSTEM_TIME
сразу после завершения этих операций.
Номера и метки времени
Каждая операция записи имеет номер и метку времени. Номер операции обозначается в запросах и ответах как cn
или sys_cn
, метка времени — как ts
.
Нумерация операций
Операции нумеруются по времени начала их исполнения в логической БД — в микросекундах с 00:00:00 UTC 1 января 1970 года. Более поздняя операция всегда имеет бо́льший номер, но может завершиться раньше другой с меньшим номером, если они выполняются в разных сущностях.
Номер операции соответствуют номеру версий данных в истории изменений логической БД. К любой такой версии можно обратиться по номеру или метке времени с помощью ключевого слова FOR SYSTEM_TIME.
На рисунке ниже показан пример с двумя операциями записи в одной логической таблице stores
. Для примера записи таблицы добавлены разными операциями.
Операции записи в одной логической таблице
Назначение меток времени
Операция записи получает метку времени:
- при закрытии дельты — если операция выполнена в дельте;
- при завершении операции — если операция выполнена вне дельты.
Метка устанавливается по серверному времени ноды.
Упорядоченность операций в сущности
Операции в каждой логической таблице и каждом материализованном представлении упорядочены по возрастанию номеров и меток времени, так как выполняются в сущности последовательно.
На рисунке ниже первая операция записи в таблице имеет номер (cn) 1744971231202222
и метку (ts) 1744971231204444
, вторая — номер 1744971231208888
и метку 1744971231209999
. То есть сначала выполнилась первая операция, потом началась и выполнилась вторая.
Номера и метки операций записи в одной логической таблице
Упорядоченность операций между сущностями
Между разными сущностями логической БД порядок номеров и меток времени операций не гарантируется из-за параллельного выполнения, но каждая операция имеет более позднюю метку времени, чем предыдущая завершенная.
На рисунке ниже операция записи в первой таблице имеет номер (cn) 1744971231202222
и метку (ts) 1744971231209999
, во второй таблице — номер 1744971231204444
и метку 1744971231208888
. То есть, пока выполнялась операция в первой таблице, операция во второй таблице успела начаться и выполниться.
Номера и метки операций записи в разных логических таблицах
Непротиворечивость изменений в операции
Операция записи в логическую таблицу должна содержать непротиворечивые изменения данных: записи со значениями первичного ключа, уникальными в рамках операции, или полные дубликаты. При наличии дубликатов записей система сохраняет только одну из них.
Разные состояния одного объекта необходимо разделять по операциям, как показано в примере ниже. В примере первоначальные данные магазина добавлены одной операцией (1744970000000123
), а изменены — другой (1744971111111123
).
Изменение данных магазина, сменившего адрес
Статусы операций
Возможные статусы операции записи:
- Выполняется (0) — обработка операции запущена и еще не завершена,
- Успешно обработана (1) — обработка операции успешно завершена,
- Отменяется (2) — отмена операции запущена и еще не завершена,
- Отменена (3) — отмена операции успешно завершена.
Операции со статусами «Выполняется» и «Отменяется» называются незавершенными, операции со статусами «Успешно обработана» и «Отменена» — завершенными.
При ошибке загрузки, обновления или синхронизации данных система отменяет неуспешную операцию записи и возвращает данные датасорсов в состояние, которое предшествовало операции.
Управление операциями
Кластер с кворумом нод автоматически отменяет сбойные операции записи при типовых сбоях, исключая необходимость ручного вмешательства.
Возможности по ручному управлению операциями описаны в разделе Управление операциями записи.