Операция записи
Содержание раздела
Операция записи — действие по сохранению изменений данных в логической таблице, снапшот-таблице или материализованном представлении.
Формирование операций
Система формирует операцию записи:
- для каждого запроса на загрузку или обновление данных в логическую таблицу или снапшот-таблицу;
- для всех изменений, загруженных в материализованное представление в цикле синхронизации.
Параллельное выполнение
Параллельные операции записи в сущность:
- не поддерживаются для логических таблиц и материализованных представлений (но поддерживаются между разными сущностями);
- поддерживаются для снапшот-таблиц.
Атомарность операций
Операции записи атомарны: если при выполнении операции произошла ошибка, система отменяет операцию* и возвращает данные датасорсов хранилища в состояние, предшествовавшее ей.
* Исключение — операция в статусе 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(Отменяется) — отмена операции запущена и еще не завершена.
Управление операциями
Кластер с кворумом нод автоматически отменяет сбойные операции записи при типовых сбоях, исключая необходимость ручного вмешательства.
Возможности по ручному управлению операциями описаны в разделе Управление операциями записи.
Выполнение операций при отключенных датасорсах
Отключенные датасорсы пропускаются при выполнении операции записи. Операция считается успешной, если данные сохранены в необходимые датасорсы.