Операция записи

Содержание раздела
  1. Операции в дельте и вне дельты
  2. Номера и метки времени
    1. Нумерация операций
    2. Назначение меток времени
    3. Упорядоченность операций в сущности
    4. Упорядоченность операций между сущностями
  3. Непротиворечивость изменений в операции
  4. Статусы операций
  5. Управление операциями

Операция записи — действие по сохранению изменений данных в логической таблице или материализованном представлении.

Система создает и обрабатывает операцию записи:

  • (в логических таблицах) для каждого запроса на загрузку или обновление данных;
  • (в материализованных представлениях) для всех изменений, загруженных в представление в цикле синхронизации.

В логической сущности одновременно может выполняться только одна операция, в разных сущностях операции могут выполняться параллельно.

Операции атомарны: если системе не удалось выполнить какое-то изменение в рамках операции, вся операция отменяется. Система изолирует изменения по операции от изменений по другим операциям и позволяет обращаться к данным отдельной операции.

Операции в дельте и вне дельты

Операции записи можно выполнять в дельте или вне дельты.

Дельта позволяет сгруппировать операции записи и управлять ими как группой, сохраняя или отменяя изменения по всем операциям группы сразу. Если в логической базе данных есть открытая дельта, все операции записи, начатые после ее открытия и завершенные до ее закрытия, попадают в эту дельту. Изменения по операциям записи в дельте становятся доступны для чтения и выгрузки без указания 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) — отмена операции успешно завершена.

Операции со статусами «Выполняется» и «Отменяется» называются незавершенными, операции со статусами «Успешно обработана» и «Отменена» — завершенными.

При ошибке загрузки, обновления или синхронизации данных система отменяет неуспешную операцию записи и возвращает данные датасорсов в состояние, которое предшествовало операции.

Управление операциями

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

Возможности по ручному управлению операциями описаны в разделе Управление операциями записи.