Перейти к основному содержимому
Версия: 2.0.x

SQL-транзакции

Запустите простую SQL-транзакцию для фиксации нескольких DML-операторов в пакете.

Обзор

Начиная с версии v1.5.2, Selena поддерживает SQL-транзакции для обеспечения атомарности обновляемых таблиц при манипулировании данными в нескольких таблицах.

Транзакция состоит из нескольких SQL-операторов, которые обрабатываются в одной атомарной единице. Операторы в транзакции либо применяются, либо отменяются вместе, что гарантирует свойства ACID (атомарность, согласованность, изоляция и надёжность) транзакции.

В настоящее время SQL-транзакции в Selena поддерживают следующие операции:

  • INSERT INTO
  • UPDATE
  • DELETE
примечание
  • INSERT OVERWRITE в настоящее время не поддерживается.
  • Несколько операторов INSERT для одной и той же таблицы в рамках транзакции поддерживаются только в cluster с shared-data начиная с версии v2.0.0.
  • UPDATE и DELETE поддерживаются только в cluster с shared-data начиная с версии v2.0.0.

Начиная с версии v2.0.0, в рамках одной SQL-транзакции:

  • Несколько операторов INSERT для одной таблицы поддерживаются.
  • Только один оператор UPDATE ИЛИ DELETE для одной таблицы разрешён.
  • Оператор UPDATE ИЛИ DELETE после операторов INSERT для той же таблицы не разрешён.

Свойства ACID транзакции гарантируются только на ограниченном уровне изоляции READ COMMITTED, то есть:

  • Оператор работает только с данными, которые были зафиксированы до начала выполнения оператора.
  • Два последовательных оператора в одной транзакции могут работать с разными данными, если другая транзакция была зафиксирована между выполнением первого и второго операторов.
  • Изменения данных, внесённые предшествующими DML-операторами, невидимы для последующих операторов в той же транзакции.

Транзакция связана с одной сессией. Несколько сессий не могут разделять одну и ту же транзакцию.

Использование

  1. Транзакция должна быть начата выполнением оператора START TRANSACTION. Selena также поддерживает синоним BEGIN.

    { START TRANSACTION | BEGIN [ WORK ] }
  2. После запуска транзакции вы можете определить несколько DML-операторов в транзакции. Для получения подробной информации см. Примечания по использованию.

  3. Транзакция должна быть явно завершена выполнением COMMIT или ROLLBACK.

    • Чтобы применить (зафиксировать) транзакцию, используйте следующий синтаксис:

      COMMIT [ WORK ]
    • Чтобы отменить (откатить) транзакцию, используйте следующий синтаксис:

      ROLLBACK [ WORK ]

Пример

  1. Создайте демонстрационную таблицу desT в cluster с shared-data и загрузите в неё данные.

    примечание

    Если вы хотите попробовать этот пример в cluster с shared-nothing, вы должны пропустить шаг 3 и определить только один оператор INSERT на шаге 4.

    CREATE TABLE desT (
    k int,
    v int
    ) PRIMARY KEY(k);

    INSERT INTO desT VALUES
    (1,1),
    (2,2),
    (3,3);
  2. Запустите транзакцию.

    START TRANSACTION;

    Или

    BEGIN WORK;
  3. Определите оператор UPDATE или DELETE.

    UPDATE desT SET v = v + 1 WHERE k = 1,

    Или

    DELETE FROM desT WHERE k = 1;
  4. Определите несколько операторов INSERT.

    -- Вставка данных с указанными значениями.
    INSERT INTO desT VALUES (4,4);
    -- Вставка данных из одной нативной таблицы в другую.
    INSERT INTO desT SELECT * FROM srcT;
    -- Вставка данных из удалённого хранилища.
    INSERT INTO desT
    SELECT * FROM FILES(
    "path" = "s3://inserttest/parquet/srcT.parquet",
    "format" = "parquet",
    "aws.s3.access_key" = "XXXXXXXXXX",
    "aws.s3.secret_key" = "YYYYYYYYYY",
    "aws.s3.region" = "us-west-2"
    );
  5. Примените или отмените транзакцию.

    • Чтобы применить SQL-операторы в транзакции.

      COMMIT WORK;
    • Чтобы отменить SQL-операторы в транзакции.

      ROLLBACK WORK;

Примечания по использованию

  • В настоящее время Selena поддерживает операторы SELECT, INSERT, UPDATE и DELETE в SQL-транзакциях. UPDATE и DELETE поддерживаются только в cluster с shared-data начиная с версии v2.0.0.
  • Операторы SELECT для таблиц, данные которых были изменены в той же транзакции, не разрешены.
  • Несколько операторов INSERT для одной и той же таблицы в рамках транзакции поддерживаются только в cluster с shared-data начиная с версии v2.0.0.
  • В рамках транзакции вы можете определить только один оператор UPDATE или DELETE для каждой таблицы, и он должен предшествовать операторам INSERT.
  • Последующие DML-операторы не могут читать незафиксированные изменения, внесённые предшествующими операторами в той же транзакции. Например, целевая таблица предшествующего оператора INSERT не может быть исходной таблицей последующих операторов. В противном случае система вернёт ошибку.
  • Все целевые таблицы DML-операторов в транзакции должны находиться в одной базе данных. Межбазовые операции не разрешены.
  • В настоящее время INSERT OVERWRITE не поддерживается.
  • Вложенные транзакции не разрешены. Вы не можете указывать BEGIN WORK внутри пары BEGIN-COMMIT/ROLLBACK.
  • Если сессия, к которой принадлежит выполняющаяся транзакция, завершается или закрывается, транзакция автоматически откатывается.
  • Selena поддерживает только ограниченный уровень изоляции транзакций READ COMMITTED, как описано выше.
  • Проверки конфликтов записи не поддерживаются. Когда две транзакции одновременно записывают в одну и ту же таблицу, обе транзакции могут быть успешно зафиксированы. Видимость (порядок) изменений данных зависит от порядка выполнения операторов COMMIT WORK.