Delen via


Atomische samengestelde instructie

Van toepassing op:aangekruist Databricks SQL aangekruist Databricks Runtime 18.0 en hoger

Implementeert een SQL-scriptblok dat een reeks SQL-instructies, besturings-of-stroominstructies, lokale variabeledeclaraties en uitzonderingshandlers kan bevatten. Wanneer het blok is gemarkeerd als ATOMIC, wordt het uitgevoerd als een transactionele eenheid waarbij alle instructies samen slagen of mislukken.

Syntaxis

BEGIN ATOMIC
  statement1;
  statement2;
  ...
END;

Parameterwaarden

Geen. Het ATOMIC trefwoord wijzigt het gedrag van de samengestelde instructies.

Beschrijving

Markeert de samengestelde opdracht als een atomair transactieblok. Alle instructies in het blok worden uitgevoerd als één transactionele eenheid: alle instructies slagen samen of alle wijzigingen worden teruggedraaid als er een instructie mislukt. In Azure Databricks worden wijzigingen automatisch doorgevoerd wanneer het blok is voltooid of worden alle wijzigingen teruggedraaid als er een instructie mislukt.

BEGIN ATOMIC ... END blokken kunnen worden genest binnen andere atomische blokken. Het binnenste blok wordt geïntegreerd in de buitenste transactie. Alle commando's worden uitgevoerd als onderdeel van één enkele grotere transactie. Dit is geen geneste transactie. Een atomisch blok kan geen niet-atomisch BEGIN ... END blok bevatten.

Dit is een niet-interactieve transactie—u hoeft COMMIT of ROLLBACK niet handmatig uit te voeren.

Requirements

  • Alle tabellen waarop in een transactie met meerdere instructies en meerdere tabellen is gehandeld, moeten:
  • Gebruik een SQL Warehouse, serverloze berekening of een cluster met Databricks Runtime 18.0 en hoger.
  • U moet over de juiste machtigingen beschikken voor objecten die zijn gewijzigd binnen de transactie. Bevoegdheden worden gecontroleerd wanneer elke instructie wordt uitgevoerd.

Examples

In de volgende voorbeelden ziet u veelvoorkomende transactiepatronen met behulp van BEGIN ATOMIC ... END;.

Updates coördineren voor meerdere tabellen

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;

Gegevens valideren voordat ze worden doorgevoerd

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;