Поделиться через


Составной оператор ATOMIC

Применяется к:помечено галочкой да Databricks SQL помечено галочкой да Databricks Runtime 18.0 и более поздних версий

Реализует блок скрипта SQL, который может содержать последовательность инструкций SQL, инструкций управления потоком, объявлений локальных переменных и обработчиков исключений. При пометке как ATOMIC, блок выполняется как транзакционная единица, в которой либо все операции завершаются успешно, либо все завершаются сбоем.

Синтаксис

BEGIN ATOMIC
  statement1;
  statement2;
  ...
END;

Параметры

Нет. Ключевое ATOMIC слово изменяет поведение составного оператора .

Описание

Помечает составную инструкцию как блок атомарных транзакций. Все инструкции в блоке выполняются как единая транзакция: либо все инструкции успешно выполняются вместе, либо все изменения откатываются в случае ошибки любой инструкции. Azure Databricks автоматически фиксирует изменения при успешном завершении блока или откатывает все изменения при сбое любой инструкции.

BEGIN ATOMIC ... END блоки могут быть вложены в другие атомарные блоки. Внутренний блок встраивается во внешнюю транзакцию — все операции выполняются как часть одной более крупной транзакции. Это не вложенная транзакция. Атомарный блок не может содержать не атомарный BEGIN ... END блок.

Это неинтерактивная транзакция— вам не нужно запускать COMMIT или ROLLBACK вручную.

Требования

  • Все таблицы, используемые в многооператорной и многотабличной транзакции, должны:
  • Используйте хранилище SQL, бессерверные вычисления или кластер под управлением Databricks Runtime 18.0 и более поздней версии.
  • Необходимо иметь соответствующие разрешения на объекты, измененные в рамках транзакции. Привилегии проверяются при выполнении каждой инструкции.

Примеры

В следующих примерах показаны распространенные шаблоны транзакций с помощью BEGIN ATOMIC ... END;.

Координация обновлений между несколькими таблицами

BEGIN ATOMIC
  UPDATE accounts SET balance = balance - 100 WHERE id = 1;
  UPDATE accounts SET balance = balance + 100 WHERE id = 2;
  INSERT INTO audit_log VALUES (1, 2, 100, current_timestamp());
END;

Проверка данных перед коммитом

BEGIN ATOMIC
  INSERT INTO staging_customers
  SELECT * FROM external_source WHERE ingest_date = current_date();

  IF (SELECT COUNT(*) FROM staging_customers WHERE email NOT LIKE '%@%') > 0 THEN
    SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Invalid email addresses found';
  END IF;

  MERGE INTO customers AS target
  USING staging_customers AS source
  ON target.customer_id = source.customer_id
  WHEN MATCHED THEN UPDATE SET *
  WHEN NOT MATCHED THEN INSERT *;
END;
  • BEGIN TRANSACTION: запуск интерактивной транзакции с ручным управлением фиксацией и откатом
  • COMMIT: фиксация интерактивной транзакции
  • ROLLBACK: откат интерактивной транзакции
  • Составная инструкция: BEGIN ... END блоки без ключевого ATOMIC слова
  • Транзакции: обзор поддержки транзакций
  • Режимы транзакций: подробные шаблоны и примеры для неинтерактивных и интерактивных транзакций