ATOMIC összetett utasítás

A következőre vonatkozik:kipipálva igen Databricks SQL kipipálva igen Databricks Runtime 18.0 és újabb

Olyan SQL-szkriptblokkot implementál, amely SQL-utasítások, folyamatvezérlési utasítások, helyi változódeklarációk és kivételkezelők sorozatát tartalmazhatja. Amikor ATOMIC meg van jelölve, a blokk tranzakciós egységként fut, ahol az összes utasítás együtt sikeres vagy sikertelen.

Szemantika

BEGIN ATOMIC
  statement1;
  statement2;
  ...
END;

Paraméterek

Nincs. A ATOMIC kulcsszó módosítja az összetett utasítás viselkedését.

Leírás

Az összetett utasítást atomi tranzakcióblokkként jelöli meg. A blokkon belüli összes utasítás egyetlen tranzakciós egységként fut – vagy az összes utasítás együtt sikeres, vagy az összes módosítás vissza lesz állítva, ha bármelyik utasítás meghiúsul. Azure Databricks automatikusan véglegesíti a módosításokat a blokk sikeres befejezésekor, vagy ha bármelyik utasítás meghiúsul, visszaállítja az összes módosítást.

BEGIN ATOMIC ... END blokkok más atomblokkokban is beágyazhatók. A belső blokk a külső tranzakcióba van lapolva – az összes utasítás egyetlen nagyobb tranzakció részeként fut. Ez nem beágyazott tranzakció. Az atomblokkok nem tartalmazhatnak nem atomi BEGIN ... END blokkokat.

Ez nem interaktív tranzakció – nem kell manuálisan futtatnia a COMMIT vagy a ROLLBACK parancsokat.

Követelmények

  • Több utasítást tartalmazó, többtáblás tranzakcióban írt összes táblának meg kell felelnie a következő követelményeknek:
  • Használjon SQL-raktárat, kiszolgáló nélküli számítást vagy Databricks Runtime 18.0-s vagy újabb verziót futtató fürtöt.
  • A tranzakción belül módosított objektumokhoz megfelelő engedélyekkel kell rendelkeznie. Az egyes utasítások futtatásakor a rendszer ellenőrzi a jogosultságokat.

Examples

Az alábbi példák a gyakori tranzakciós mintákat mutatják be a használatával BEGIN ATOMIC ... END;.

Frissítések koordinálása több táblában

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;

Adatok érvényesítése véglegesítés előtt

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;