Tranzakciók

Fontos

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 lehetővé teszik a műveletek több SQL-utasítás és tábla közötti összehangolását. 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-tulajdonságokkal rendelkeznek: atomicitás, konzisztencia, izoláció é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:

Nem interaktív

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;

Interaktív

BEGIN TRANSACTION;
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());
COMMIT;

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 OpenSharing-objektumok 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, PyODBC

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
USE CATALOG és USE SCHEMA A tranzakcióban szereplő utasítások aktuális katalógusának vagy sémájának beállítása
EXECUTE IMMEDIATE Futtatáskor dinamikusan konstruktált SQL-utasítás futtatása
DESCRIBE TABLE Metaadatokat ad vissza egy tábláról, például az oszlopairól és tulajdonságairól
SHOW COLUMNS Táblázat oszlopainak listázása
GET DIAGNOSTICS nyilatkozat Diagnosztikai adatok lekérése, például az aktív tranzakció állapota vagy a legutóbbi utasítás által érintett sorok száma

Támogatott olvasási források és írási fogadók

A tranzakciók lehetővé teszik a Unity Catalog-táblákból (Delta Lake és Iceberg), streamelési táblákból, nézetekből és materializált nézetekből való olvasást.

A Delta Lake- és Iceberg-táblák (beleértve a streamelési táblákat is) ACID-garanciákat biztosítanak, ezért tranzakciókban is támogatottak mind olvasási forrásként, mind írási célként. Ha nem tranzakciós forrásokból szeretne olvasni, használja a tippet allow_nontransactional_read . Lásd: Olvasás nem tranzakciós forrásokból és példa: nem tranzakciós olvasás.

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

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.

A tranzakciók lehetővé teszik a nem tranzakciós forrásokból való olvasást. A nem tranzakciós források közé tartoznak a Parquet, Avro, CSV és JSON fájlformátumokat használó külső táblák, valamint a JDBC-t használó összevont táblák. A nem tranzakciós források olvasásához hivatkozzon a forrásra név alapján, és használja a allow_nontransactional_read tippet.

Egy tranzakción belül lekérdezheti a information_schema.

A fájlokat közvetlenül a read_files táblaértékű függvénnyel olvashatja el.

Az elérési útalapú hozzáférés nem támogatott. Ha ehelyett közvetlenül az elérési út alapján hivatkozik egy fájlra, például FROM parquet.`/path/to/data`, a tranzakció PATH_BASED_ACCESS hibával meghiúsul.

Az alábbi példakód bemutatja, hogyan használható a tipp egy külső táblán A JSON használatával:

BEGIN TRANSACTION;
-- Non-transactional source, hint required
INSERT INTO transactional_table
SELECT col1, col2
FROM external_json_table
WITH (allow_nontransactional_read = true);

COMMIT;

Példa: nem tranzakcionális olvasás

Az alábbi példa egy nem tranzakciós olvasást mutat be egy külső táblából a Parquet használatával. Ebben a példában egy meglévő, olvasási és írási hozzáféréssel rendelkező külső helyet kell létrehoznia.

Lásd: Kapcsolódás Azure Data Lake Storage Gen2 (ADLS Gen2) külső helyhez.

Ha a Parquet-forrást elnevezett külső táblaként szeretné regisztrálni, futtassa a következőket:

CREATE TABLE main.default.external_parquet_table
USING PARQUET
LOCATION 'abfss://my-container@my-storage-account.dfs.core.windows.net/path/to/data'; -- existing external location

Ha nem tranzakciós Parquet-forrást és felügyelt táblát is szeretne olvasni egy tranzakcióban a Delta Lake használatával, futtassa a következőket:

BEGIN ATOMIC
-- Non-transactional source, hint required
INSERT INTO transactional_table
SELECT col1, col2
FROM external_parquet_table
WITH (allow_nontransactional_read = true);

-- Managed table source, no hint is required
INSERT INTO another_table
SELECT * FROM managed_delta_table;
END;

Tranzakcióelkülönítés

A tranzakciók lehetővé teszik az összes utasítás ismétlődő olvasását. 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.

Az alábbi példában a tranzakció első lekérdezése products konzisztens pillanatképet rögzít:

Nem interaktív

BEGIN ATOMIC
  SELECT * FROM products WHERE product_id = 1001;
  SELECT * FROM products WHERE product_id = 1001;
END;

Interaktív

BEGIN TRANSACTION;
SELECT * FROM products WHERE product_id = 1001;
SELECT * FROM products WHERE product_id = 1001;
COMMIT;

Ezután tegyük fel, hogy egy másik felhasználó egyidejűleg frissíti a sort product_id = 1001 a második lekérdezés megkezdése előtt:

UPDATE products SET price = 29.99 WHERE product_id = 1001;

Mivel a pillanatképet az első hozzáféréskor rögzítették, a második lekérdezés products az eredeti sort adja vissza, nem a frissítettet.

Ü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. Amikor kötelezed a döntést, az Azure Databricks ellenőrzi a tranzakció által írt táblákat, hogy megállapítsa, más tranzakciók módosították-e ugyanazt az adatokat a tranzakció kezdete 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 A tranzakció által írt táblázaton egy másik tranzakció módosítja azokat a sorokat, amelyeket a tranzakció olvas. 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ást tesz lehetővé, é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 lehetővé teszi a módosítások elvetésére az érvényesítési logika vagy az üzleti szabályok alapján, illetve egy utasításhiba után, amikor a munkamenet aktív marad.

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.
  • Sorszintű egyidejűség esetén használhatóBEGIN ATOMIC: A nem interaktív tranzakciók (BEGIN ATOMIC ... END;) a sor szintjén észlelik az ütközéseket, ami csökkenti az ütközéseket az interaktív tranzakciók által használt táblaszintű észleléshez képest. Lásd : nem interaktív tranzakciók.
  • Újrapróbálkozás logikája: Egy tranzakció ütközés miatt bármikor meghiúsulhat. Hozzon létre újrapróbálkoztatási logikát az alkalmazásba, és próbálkozzon újra a sikertelen tranzakciókkal, friss adatokkal.
  • Indítsa el az összes interaktív munkamenetet egy visszaállítással: Az interaktív munkamenet elején futtassa a ROLLBACK parancsot az esetleges korábbi tranzakcióállapotok törléséhez.

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.
A DDL-műveletek nem támogatottak Futtassa a DDL-műveleteket, például CREATE TABLE, ALTER TABLE vagy DROP TABLE, tranzakciókon kívül. A tranzakciók által támogatott műveletekről a Támogatott műveletek című témakörben olvashat.
Egyes metaadat-műveletek nem támogatottak Egyes metaadat-műveletek protokolltól függetlenül nem működnek a tranzakciókon belül. Ide tartoznak a Thrift RPC-alapú metaadathívások (például a JDBC-DatabaseMetaData metódusok és az ODBC-katalógusfüggvények), az objektumokat felsoroló SQL-alapú parancsok (például a SHOW TABLES és a SHOW DATABASES), valamint a rendszertáblák elleni SELECT lekérdezések. Futtassa ezeket a metaadat-műveleteket 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.
Sorszintű párhuzamosság a(z) MERGE esetén A MERGE műveletek sorszintű párhuzamos végrehajtása nem támogatott az AWS GovCloudban és az egyfelhasználós (dedikált) fürtök esetén. Ezeken a platformokon a MERGE műveletek táblaszintű egyidejűséget használnak. Lásd: Sorszintű konkurencia.
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.
OpenSharing megosztott táblákra vonatkozó követelmény Az OpenSharing-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.
az OpenSharing-címzett számítási kapacitására vonatkozó korlátozások 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.
OpenSharing forrástábla ütközése Az OpenSharing-címzettek nem hivatkozhat megosztott nézetre és megosztott táblára, amelyek egyetlen tranzakción belül ugyanarra a forrástáblára hivatkoznak.

További erőforrások