Dela via


ATOMIC sammansatt uttryck

Gäller för:avbockad ja Databricks SQL avbockad ja Databricks Runtime 18.0 och senare

Implementerar ett SQL-skriptblock som kan innehålla en sekvens med SQL-instruktioner, flödeskontrollinstruktioner, lokala variabeldeklarationer och undantagshanterare. När det markeras som ATOMIC körs blocket som en transaktionsenhet där alla satser lyckas tillsammans eller misslyckas tillsammans.

Syntax

BEGIN ATOMIC
  statement1;
  statement2;
  ...
END;

Parameters

Ingen. Nyckelordet ATOMIC ändrar beteendet för sammansatta uttryck .

Beskrivning

Markerar den sammansatta instruktionen som ett atomiskt transaktionsblock. Alla instruktioner i blocket körs som en enda transaktionsenhet – antingen lyckas alla instruktioner tillsammans eller så återställs alla ändringar om någon instruktion misslyckas. Azure Databricks begår automatiskt ändringar när blocket har slutförts framgångsrikt, eller återställer alla ändringar om något uttalande misslyckas.

BEGIN ATOMIC ... END block kan vara inkapslade inom andra atomiska block. Det inre blocket förs samman med den yttre transaktionen, och alla satser körs som del av en enda, större transaktion. Det här är inte en kapslad transaktion. Ett atomiskt block får inte innehålla ett icke-atomiskt BEGIN ... END block.

Det här är en icke-interaktiv transaktion – du behöver inte köra COMMIT eller ROLLBACK manuellt.

Requirements

  • Alla tabeller som skrivs till i en transaktion som omfattar flera uttalanden och tabeller måste:
  • Använd ett SQL-lager, serverlös beräkning eller ett kluster som kör Databricks Runtime 18.0 och senare.
  • Du måste ha rätt behörighet för objekt som ändrats i transaktionen. Behörigheter kontrolleras när varje kommando körs.

Exempel

Följande exempel visar vanliga transaktionsmönster med hjälp av BEGIN ATOMIC ... END;.

Samordna uppdateringar i flera tabeller

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;

Verifiera data innan du gör förändringar

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;
  • BÖRJA TRANSAKTION: Starta en interaktiv transaktion med manuell inchecknings-/återställningskontroll
  • COMMIT: Genomför en interaktiv transaktion
  • RULLA TILLBAKA: Rulla tillbaka en interaktiv transaktion
  • Sammansatt sats: BEGIN ... END blocken utan nyckelordet ATOMIC
  • Transaktioner: Översikt över transaktionsstöd
  • Transaktionslägen: Detaljerade mönster och exempel för icke-interaktiva och interaktiva transaktioner