Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
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:
- Unity Catalog által kezelt táblák (Delta Lake vagy Iceberg)
- A katalógus véglegesítéseinek engedélyezése
- 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:
-
SQL-szerkesztő és -jegyzetfüzetek: Használja
BEGIN ATOMIC ... END;vagyBEGIN TRANSACTION; ... COMMIT;szintaxist közvetlenül AZ SQL-cellákban, vagy használjaspark.sql()Python/Scala-jegyzetfüzetekben. Lásd Tranzakciós módok. -
JDBC-alkalmazások: JDBC API-metódusok (
setAutoCommit(false),commit(),rollback()) használata a Databricks JDBC-illesztőprogram 3.0.5-ös és újabb verziójával. Lásd például: Tranzakciók használata. A tranzakciókon belüli nem támogatott JDBC-műveletek listáját lásd: Nem támogatott JDBC-műveletek. - ODBC-alkalmazások: Használja a Databricks ODBC Driver 2.10.0-s vagy újabb verzióját. A tranzakciókon belüli nem támogatott ODBC-műveletek listáját lásd: Nem támogatott ODBC-műveletek.
-
Python alkalmazások: A Databricks SQL Connector használata
autocommit=False. Lásd: Databricks SQL Connector for Python. A tranzakciókon belüli nem támogatott Python összekötőműveletek listáját lásd: Nem támogatott Python összekötőműveletek. - Utasítás-végrehajtási API: Tranzakciók futtatása SQL-szintaxissal API-hívásokon keresztül. Lásd: Az utasításvégrehajtási API használata.
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. |