Sdílet prostřednictvím


Příkaz ATOMIC složeného výrazu

Platí pro:zaškrtnuto ano Databricks SQL zaškrtnuto ano Databricks Runtime 18.0 a vyšší

Implementuje blok skriptu SQL, který může obsahovat posloupnost příkazů SQL, příkazy control-of-flow, místní deklarace proměnných a obslužné rutiny výjimek. Pokud je blok označený jako ATOMIC, spustí se jako transakční jednotka, kde všechny příkazy uspějí společně nebo selžou dohromady.

Syntaxe

BEGIN ATOMIC
  statement1;
  statement2;
  ...
END;

Parametry

Žádné. Klíčové slovo ATOMIC upravuje chování složeného příkazu.

Description

Označí složený příkaz jako atomický blok transakce. Všechny příkazy v rámci bloku se spouští jako jedna transakční jednotka – buď všechny příkazy uspějí společně, nebo se všechny změny vrátí zpět, pokud některý z nich selže. Azure Databricks automaticky potvrdí změny, jakmile se blok úspěšně dokončí, nebo vrátí zpět všechny změny, pokud některý příkaz selže.

BEGIN ATOMIC ... END bloky mohou být vnořeny do jiných atomických bloků. Vnitřní blok je vložený do vnější transakce – všechny příkazy běží jako součást jediného většího transakčního procesu. Nejedná se o vnořenou transakci. Atomický blok nemůže obsahovat ne atomický BEGIN ... END blok.

Jedná se o neinteraktivní transakci – nemusíte spouštět COMMIT ani ROLLBACK ručně.

Požadavky

  • Všechny tabulky, do kterých se zapisuje v transakci s několika výrazy a více tabulkami, musí:
  • Použijte sklad SQL, bezserverové výpočetní prostředky nebo cluster s Databricks Runtime 18.0 a novějším.
  • Musíte mít příslušná oprávnění k objektům upraveným v rámci transakce. Při spuštění každého příkazu se zkontrolují oprávnění.

Příklady

Následující příklady ukazují běžné vzory transakcí pomocí BEGIN ATOMIC ... END;.

Koordinace aktualizací napříč několika tabulkami

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;

Validujte data před potvrzením

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: Spuštění interaktivní transakce s ručním ovládáním potvrzení/vrácení
  • COMMIT: Potvrzení interaktivní transakce
  • VRÁCENÍ: Vrátit interaktivní transakci
  • Složený příkaz: BEGIN ... END bloky bez klíčového ATOMIC slova
  • Transakce: Přehled podpory transakcí
  • Režimy transakcí: Podrobné vzory a příklady pro neinteraktivní a interaktivní transakce