Tranzakciók

Fontos

A Unity Catalog által felügyelt Delta-táblákba írt tranzakciók nyilvános előzetes verzióban érhetők el.

A Unity Catalog által felügyelt Iceberg-táblákba írt tranzakciók privát előzetes verzióban érhetők el. Az előzetes verzióhoz való csatlakozáshoz küldje el a felügyelt Iceberg-táblák előzetes regisztrációs űrlapot.

A tranzakciók segítségével több SQL-utasítás és tábla műveleteit koordinálhatja. Az összes módosítás vagy együtt sikeres, vagy együtt visszagördül, így biztosítva az adatkonzisztenciát a műveletek és táblák között. A tranzakciók ACID-garanciákat biztosítanak: atomiság, konzisztencia, izoláltság és tartósság. Lásd: Milyenek az ACID-garanciák az Azure Databricks szolgáltatásban?. A tranzakciók tárolt eljárásokkal és SQL Scriptinggel használhatók a kritikus fontosságú adattárház-számítási feladatok létrehozásához.

Az alábbi példa egy tranzakciót mutat be:

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;

Mindhárom utasítás együtt elköteleződik. Ha bármelyik utasítás meghiúsul, az összes módosítás visszaáll, és a Databricks mellékhatások nélkül leállítja a tranzakciót.

A tranzakciókkal kapcsolatos gyakorlati gyakorlatért tekintse meg az oktatóanyagot: Tranzakciók koordinálása táblák között.

Követelmények

Több utasítást vagy több táblát érintő tranzakciók végrehajtása:

  • Minden táblára írni kell:
  • Támogatott számítás használata:
    • Nem interaktív tranzakciók esetén használja a Databricks Runtime 18.0-s vagy újabb verzióját futtató SQL Warehouse-t, kiszolgáló nélküli számítást vagy fürtöt.
    • Interaktív tranzakciókhoz használjon bármely SQL Warehouse-t.
    • Megosztott Delta-megosztási eszközök tranzakcióihoz használja a Databricks Runtime 18.1-et vagy újabb verzióját.

Tranzakciós módok

Azure Databricks két tranzakciós módot támogat:

Mód Szemantika Elköteleződés Visszagörgetés A következőkre alkalmas
Nem interaktív ATOMIC összetett utasítás Automatikus siker esetén Automatikus aktiválás hiba esetén Rögzített sorozatok, ütemezett feladatok
Interaktív TRANZAKCIÓ INDÍTÁSA; VÉGLEGESÍTÉS; Kézikönyv Kézikönyv Feltételes logika, ellenőrzés és hibakeresés, JDBC, ODBC, PyDBC

Mindkét mód részletes szintaxisát, példáit és használati mintáit a Tranzakciós módok című témakörben találja.

Támogatott műveletek

A tranzakciókon belül a következő műveleteket használhatja:

Operation Leírás
SELECT (alválasztás) Adatok lekérdezése és eredmények ellenőrzése
VALUES klauzula Tesztadatok vagy állandó értékek létrehozása
INSERT (az összes változatot is beleértve) Új sorok hozzáadása
UPDATE Meglévő sorok módosítása
COPY INTO Adatok betöltése fájlból Delta-táblába
DELETE FROM Sorok eltávolítása
MERGE INTO A beszúrást, frissítést és törlést kombináló upsert minták

Források olvasása tranzakciókban

A tranzakciók a Unity Catalog tábláiból (Delta és Iceberg), streamelési táblákból, nézetekből és materializált nézetekből olvashatók. Ha nem tranzakciós forrásokból szeretne olvasni, használja a tippet allow_nontransactional_reads .

Olvasás nem tranzakciós forrásokból

Ha nem tranzakciós forrásokból, például Parquet-fájlokból, Avro-fájlokból és összevont táblákból szeretne JDBC-vel olvasni, használja a allow_nontransactional_reads tippet, ahogy az alábbi példa is mutatja:

BEGIN TRANSACTION;

-- Read from a non-transactional Parquet source
INSERT INTO transactional_table
SELECT col1, col2
FROM parquet.`/path/to/data`
WITH (allow_nontransactional_reads = true);

-- Read from a managed Delta table (no hint needed)
INSERT INTO another_table
SELECT * FROM managed_delta_table;

COMMIT;

Figyelmeztetés

A nem tranzakciós olvasások nem megismételhetők. A forrásadatok egyidejű módosítása a tranzakció során inkonzisztens olvasást eredményezhet.

Tranzakcióelkülönítés

A tranzakciók minden utasításban ismétlődő olvasást biztosítanak. Amikor egy tranzakcióban hozzáfér egy táblához, Azure Databricks az első hozzáféréskor rögzíti a tábla konzisztens pillanatképét. A táblázat minden későbbi olvasása ezt a pillanatképet használja, így az olvasások akkor is konzisztensek maradnak, ha más felhasználók egyidejűleg módosítják ugyanazokat a táblákat.

Példa:

BEGIN TRANSACTION;

-- First access to products table captures snapshot
SELECT * FROM products WHERE product_id = 1001;

-- Another user updates product 1001

-- Still reads the same snapshot (repeatable read)
SELECT * FROM products WHERE product_id = 1001;

COMMIT;

Ütközésészlelés és egyidejűség

Azure Databricks optimista egyidejűségi vezérlést használ. A tranzakciók zárolás nélkül folytatódnak, és a véglegesítéskor ütközések észlelhetők. A véglegesítéskor Azure Databricks ellenőrzi, hogy más tranzakciók módosították-e ugyanazokat az adatokat a tranzakció elindítása után. Ha ütközések állnak fenn, a tranzakció meghiúsul. Nem interaktív tranzakciók esetén a visszaállítás is automatikusan megtörténik. Interaktív tranzakciók esetén explicit módon kell futtatnia ROLLBACK a tranzakció állapotának törlését egy új tranzakció megkezdése előtt.

A nem interaktív tranzakciók támogatják a sorszintű egyidejűséget. Két tranzakció anélkül módosíthatja ugyanabban az adatfájlban a különböző sorokat, hogy ütköznek, ha a sorszintű egyidejűség engedélyezve van a céltáblákon.

Az interaktív tranzakciók támogatják a táblaszintű egyidejűséget.

Ütközési forgatókönyvek

Scenario Leírás
Írás-írás konfliktusok Két tranzakció frissíti vagy törli ugyanazokat a sorokat.
Írás-olvasás ütközések Egy másik tranzakció módosította a tranzakció által beolvasott sorokat. Csak szerializálható elkülönítésre vonatkozik.
Fantom olvasási ütközések Egy másik tranzakció új sorokat adott hozzá, amelyek megfelelnek a tranzakció olvasási predikátumának. A WriteSerializable és a szerializálható szigetelésre egyaránt vonatkozik.
Metaadat-ütközések Egy másik tranzakció módosította a tábla sémáját vagy tulajdonságait.

A tranzakciók elkülönítési szintjeiről és ütközések feloldásáról további információt a Tranzakciós módok című témakörben talál. Az elkülönítési szintekről és a Delta Lake-táblák írási ütközési viselkedéséről a Azure Databricks Optimizálási javaslatok Azure Databricks című témakörben olvashat.

A tranzakciók megjelenése a Delta-naplóban

Minden sikeres tranzakció egyetlen bejegyzésként jelenik meg a tábla Delta-naplójában, függetlenül attól, hogy hány egyes utasítás futott a tranzakción belül. Ez tiszta naplózási útvonalat biztosít, és leegyszerűsíti a visszaállítási műveleteket.

A tranzakción belüli egyes műveletek JSON-metaadatokként érhetők el a tranzakció deltanapló-bejegyzésében.

Hibakezelés és visszaállítás

Az alábbi táblázat bemutatja, hogyan fordulnak elő hiba-visszaállítások mindkét tranzakciótípus esetében:

Scenario Nem interaktív tranzakciók viselkedése Interaktív tranzakciók viselkedése
Nyilatkozathiba Minden olyan utasítás, amely hibát jelez, azonnali automatikus visszaállítást okoz. Ha a munkamenet még aktív, explicit módon kell futtatnia a ROLLBACK parancsot a módosítások elvetéséhez.
Sikertelen érvényesítési logika vagy üzleti szabályok Az SIGNAL használatával kivételt dobhatunk, és automatikus visszagörgetést indíthatunk el. A módosítások elvetéséhez futtassa a ROLLBACK parancsot .
Munkamenet megszakítása A tranzakció automatikusan visszagördül. A tranzakció automatikusan visszagördül.
Időkorlát Automatikusan visszagördül 48 óra teljes időtartam után. Automatikusan visszagördül 10 perc inaktivitás vagy 48 óra teljes időtartam után (lásd : Korlátozások). A tranzakció mellékhatások nélkül leáll, de explicit módon kell futtatnia a ROLLBACK parancsot a tranzakció állapotának törléséhez, ha a munkamenet továbbra is aktív.

Interaktív tranzakciók esetén kifejezetten visszavonhatja a tranzakciót a ROLLBACK utasítással. Ez hasznos akkor, amikor érvényességi logika vagy üzleti szabályok alapján szeretné elvetni a módosításokat, vagy ha a munkamenet aktív marad egy utasításhiba után.

Bevált gyakorlatok

Kövesse az alábbi eljárásokat az ütközések csökkentéséhez és a tranzakció teljesítményének optimalizálásához.

Ütközések elkerülése

  • Tartsa rövidre a tranzakciókat: A hosszan futó tranzakciók növelik az ütközés valószínűségét, és hosszabb ideig tartják az erőforrásokat.
  • Korai ellenőrzés: Ellenőrizze az előfeltételeket a tranzakció elején, hogy gyorsan meghiúsuljon.
  • A Databricks a legtöbb használati esetben nem interaktív tranzakciókat javasol: a nem interaktív tranzakciók sorszintű egyidejűséget használnak. Lásd : nem interaktív tranzakciók.
  • Újrapróbálkozás ütközések esetén: Ütközések bekövetkeztekor próbálja újra a tranzakciót friss adatokkal.

Különböző ügyfelek tranzakcióinak használata

A tranzakciók különböző ügyfélfelületeken működnek:

Korlátozások

A tranzakciókra a következő korlátozások vonatkoznak:

Korlátozás Leírás
Interaktív tranzakcióütközések Interaktív tranzakciók (BEGIN TRANSACTION; ... COMMIT;) konzervatívabb ütközésészlelést használnak, mint a nem interaktív tranzakciók, és táblaszinten ütközhetnek, kivéve INSERT a célzott táblából be nem olvasott műveleteket. Használjon nem interaktív tranzakciókat (ATOMIC összetett utasítást), ha a sorszintű ütközésészlelés fontos. Lásd : nem interaktív tranzakciók.
Célok írása Csak olyan, a Unity Catalog által felügyelt Delta- vagy Iceberg-táblákba írhat, amelyeken engedélyezve van a catalogManaged táblafunkció. Lásd a katalógus véglegesítéseit.
Csak DML-műveletek A tranzakciók támogatják SELECT, INSERT, UPDATE, DELETE, COPY INTOés MERGE. Futtassa a DDL-műveleteket, például CREATE TABLE, ALTER TABLE vagy DROP TABLE, tranzakciókon kívül.
A metaadat-műveletek nem támogatottak A metaadat-műveletek protokolltól függetlenül nem működnek a tranzakciókon belül. Ebbe beletartoznak az RPC-alapú metaadathívások (például JDBC-metódusok DatabaseMetaData és ODBC-katalógusfüggvények), az SQL-alapú parancsok (SHOW TABLES, SHOW DATABASES, DESCRIBE TABLE), valamint SELECT táblák vagy rendszertáblák lekérdezései information_schema. Metaadat-műveletek futtatása tranzakciókon kívül.
COPY INTO Konkurencia A parancsot COPY INTO futtató tranzakció meghiúsul, ha egy másik COPY INTO parancs egyidejűleg fut, hogy ugyanarra a táblára írjon, és először véglegesítse.
A folyamatos adatfolyam-írás nem támogatott A streamelő táblákba történő tranzakciós írások nem támogatottak.
Az RLS- és CLM-táblák nem támogatottak A sorszűrőket és oszlopmaszkokat tartalmazó táblák nem vehetnek részt a tranzakciókban.
Táblázat- és megtekintési korlátok A tranzakciók legfeljebb 100 táblából olvashatnak vagy írhatnak egyszerre, és akár 100 nézetből is olvashatnak. Minden tábla legfeljebb 100 köztes véglegesítéssel rendelkezhet egy tranzakción belül.
Az időutazás nem támogatott Nem használhat időutazást tranzakción belül.
Üresjárati időtúllépés Az interaktív tranzakciók 10 perc inaktivitás után visszafordulnak. A tranzakció mellékhatások nélkül leáll, de explicit módon kell futtatnia a ROLLBACK parancsot a tranzakció állapotának törléséhez, ha a munkamenet továbbra is aktív.
Lineage A tranzakciók sortörést bocsátanak ki az egyes olvasási és írási műveletek során. A leszármazási események akkor is fennmaradnak, ha a tranzakciót visszaállítják.
Maximális időtartam Az összes tranzakció automatikusan visszagördül 48 óra teljes időtartam után. Interaktív tranzakciók esetén a tranzakció mellékhatások nélkül fejeződik be, de explicit módon futtatnia kell a ROLLBACK parancsot a tranzakció állapotának törléséhez, ha a munkamenet továbbra is aktív.
Delta Sharing megosztott táblák követelménye A deltamegosztási szolgáltatóknak meg kell osztaniuk egy táblát WITH HISTORY , hogy a címzettek tranzakciókat futtassanak rajta. A címzettek bármilyen típusú számítással futtathatnak tranzakciókat.
A deltamegosztás címzettjének számítási korlátozásai Azure Databricks címzettek csak megosztott nézeteken, materializált nézeteken, streamelési táblákon és nem Iceberg-alapú idegen táblákon futtathatnak tranzakciókat. A szolgáltatóval azonos Azure Databricks fiókban lévő címzetteknek megosztott vagy kiszolgáló nélküli számítást kell használniuk. Egy másik fiók címzettjeinek kiszolgáló nélküli számítást kell használniuk.
Delta-megosztási forrástábla ütközése A Delta Sharing címzettjei nem hivatkozhatnak egyszerre egy megosztott nézetre és egy megosztott táblára, amelyek ugyanazon forrástáblára utalnak egyetlen tranzakción belül.

Következő lépések