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

Содержание раздела
  1. Формирование операций
  2. Параллельное выполнение
  3. Атомарность операций
  4. Операции в дельтах и вне дельт
  5. Номера и метки времени
    1. Нумерация операций
    2. Метки времени операций
    3. Упорядоченность операций в сущностях
    4. Упорядоченность операций между сущностями
  6. Непротиворечивость изменений в операции
  7. Статусы операций
  8. Управление операциями
  9. Выполнение операций при отключенных датасорсах

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

Формирование операций

Система формирует операцию записи:

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

Параллельное выполнение

Параллельные операции записи в сущность:

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

Атомарность операций

Операции записи атомарны: если при выполнении операции произошла ошибка, система отменяет операцию* и возвращает данные датасорсов хранилища в состояние, предшествовавшее ей.

* Исключение — операция в статусе 1 в снапшот-таблице, которая может завершиться с ошибкой и не быть отменена системой.

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

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

Операции записи в логические таблицы можно выполнять в дельте или вне дельты (см. сравнение ниже). Операции в снапшот-таблицах всегда выполняются вне дельты даже при наличии открытой дельты в логической БД.

Характеристика Операции в дельте Операции вне дельты
Область действия Операции в логических таблицах между открытием и закрытием дельты
  • Операции в логических таблицах между закрытием одной дельты и открытием следующей;
  • Операции в снапшот-таблицах независимо от наличия/отсутствия открытой дельты
Управление Групповое (сохранение или откат всех операций вместе) Индивидуальное
Видимость изменений без FOR SYSTEM_TIME После закрытия дельты После завершения операции

Номера и метки времени

Каждая операция записи имеет номер и метку времени. Номер операции обозначается в запросах и ответах как cn или sys_cn, метка времени — как ts.

Нумерация операций

Операции нумеруются по времени начала их исполнения в логической БД — в микросекундах с 00:00:00 UTC 1 января 1970 года. Более поздняя операция всегда имеет бо́льший номер, но может завершиться раньше другой с меньшим номером, если они выполняются в разных сущностях.

Номер операции соответствуют номеру версии данных в логической БД.

На рисунке ниже показан пример с двумя операциями в одной логической таблице stores. Для примера записи таблицы добавлены разными операциями.

Операции в одной логической таблице

Метки времени операций

Операция записи получает метку времени:

  • [в логической таблице] при закрытии дельты (если операция — в дельте) или при завершении операции (если операция — вне дельты);
  • [в материализованном представлении] при закрытии дельты синхронизации;
  • [в снапшот-таблице] при завершении операции.

Метки устанавливаются по серверному времени ноды.

Упорядоченность операций в сущностях

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

На рисунке ниже первая операция в логической таблице имеет номер (cn) 1744971231202222 и метку (ts) 1744971231204444, вторая — номер 1744971231208888 и метку 1744971231209999. То есть сначала выполнилась первая операция, потом началась и выполнилась вторая.

Номера и метки операций в логической таблице

Упорядоченность операций между сущностями

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

На рисунке ниже операция в первой таблице имеет номер (cn) 1744971231202222 и метку (ts) 1744971231209999, во второй таблице — номер 1744971231204444 и метку 1744971231208888. То есть, пока выполнялась операция в первой таблице, операция во второй таблице успела начаться и выполниться.

Номера и метки операций в разных логических таблицах

Непротиворечивость изменений в операции

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

Разные состояния одного объекта необходимо разделять по разным операциям, как показано в примере ниже, иначе будет сохранено случайное из этих состояний. В примере данные магазина добавлены одной операцией (1744970000000123), а изменены — другой (1744971111111123).

Изменение данных магазина, сменившего адрес

Статусы операций

Возможные статусы операции записи:

  • 0 (Выполняется) — обработка операции запущена и еще не завершена;
  • 1 (Подготовлена) — фаза 1 обработки завершена, и изменения подготовлены для фиксации;
  • 2 (Отменяется) — отмена операции запущена и еще не завершена.

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

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

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

Выполнение операций при отключенных датасорсах

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