Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Belangrijk
Transacties die naar beheerde Iceberg-tabellen in Unity Catalog schrijven, bevinden zich in private preview. Als u wilt deelnemen aan deze preview, dient u het voorbeeldformulier voor beheerde Iceberg-tabellen in.
Met transacties kunt u bewerkingen coördineren in meerdere SQL-instructies en -tabellen. Alle wijzigingen slagen samen of worden teruggedraaid, waardoor gegevensconsistentie tussen uw bewerkingen en tabellen wordt gegarandeerd. Transacties omvatten ACID-eigenschappen: atomiciteit, consistentie, isolatie en duurzaamheid. Zie Wat zijn ACID-garanties voor Azure Databricks?.
Transacties kunnen worden gebruikt met opgeslagen procedures en SQL Scripting om bedrijfskritieke opslagworkloads te bouwen.
In het volgende voorbeeld ziet u een transactie:
Niet-interactief
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;
Interactief
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;
Alle drie de statements worden samen verwerkt. Als een statement mislukt, worden alle wijzigingen teruggedraaid en beëindigt Databricks de transactie zonder ongewenste gevolgen.
Zie Zelfstudie: Transacties coördineren tussen tabellen voor praktische praktijk met transacties.
Requirements
Om transacties uit te voeren die meerdere instructies of meerdere tabellen omvatten:
- Alle tabellen die naar zijn geschreven, moeten:
- Gebruik door Unity Catalog beheerde tabellen (Delta Lake of Iceberg)
- Catalogusdoorvoeringen inschakelen
- Ondersteunde berekeningen gebruiken:
- Gebruik voor niet-interactieve transacties een SQL-warehouse, serverloze berekening of cluster waarop Databricks Runtime 18.0 en hoger wordt uitgevoerd.
- Gebruik een SQL Warehouse voor interactieve transacties.
- Gebruik Databricks Runtime 18.1 en hoger voor transacties op gedeelde OpenSharing-assets.
Transactiemodi
Azure Databricks ondersteunt twee transactiemodi:
| Mode | Syntaxis | Doorvoeren | Terugdraaien | Ideaal voor |
|---|---|---|---|---|
| Niet-interactief | Atomische samengestelde uitdrukking | Automatisch bij succes | Automatisch bij fout | Vaste reeksen, geplande taken |
| Interactief | BEGIN TRANSACTIE; DOORVOEREN; | Handleiding | Handleiding | Voorwaardelijke logica, validatie en foutopsporing, JDBC, ODBC, PyODBC |
Zie Transactiemodi voor gedetailleerde syntaxis, voorbeelden en gebruikspatronen voor beide modi.
Ondersteunde bewerkingen
U kunt de volgende bewerkingen binnen transacties gebruiken:
| Operatie | Beschrijving |
|---|---|
SELECT (onderselectie) |
Query's uitvoeren op gegevens en resultaten valideren |
VALUES clausule |
Testgegevens of constante waarden genereren |
INSERT (inclusief alle varianten) |
Nieuwe rijen toevoegen |
UPDATE |
Bestaande rijen wijzigen |
COPY INTO |
Gegevens uit een bestand laden in een Delta-tabel |
DELETE FROM |
Rijen verwijderen |
MERGE INTO |
Upsert-patronen waarbij invoegen, bijwerken en verwijderen worden gecombineerd |
| USE CATALOG en USE SCHEMA | Stel de huidige catalogus of het huidige schema in voor instructies in de transactie |
| EXECUTE IMMEDIATE | Een SQL-instructie uitvoeren die u dynamisch tijdens runtime maakt |
| DESCRIBE TABLE | Metagegevens retourneren over een tabel, zoals de kolommen en eigenschappen |
| SHOW COLUMNS | De kolommen in een tabel weergeven |
| GET DIAGNOSTICS-verklaring | Diagnostische gegevens ophalen, zoals de status van de actieve transactie of het aantal rijen dat is beïnvloed door de meest recente instructie |
Ondersteunde leesbronnen en schrijfsinks
Met transacties kunt u gegevens lezen uit Unity Catalog-tabellen (Delta Lake en Iceberg), streaming-tabellen, weergaven en gematerialiseerde weergaven.
Dankzij ACID-garanties worden open tabelformaten, zoals Delta Lake en Iceberg, ondersteund voor gebruik in transacties, zowel als leesbron en als schrijfsink. Als u wilt lezen uit niet-transactionele bronnen, gebruikt u de allow_nontransactional_read hint. Zie Lezen uit niet-transactionele bronnen en voorbeeld: niet-transactioneel lezen.
Lezen uit niet-transactionele bronnen
Waarschuwing
Niet-transactionele leesbewerkingen zijn niet herhaalbaar. Gelijktijdige wijzigingen in de brongegevens tijdens de transactie kunnen leiden tot inconsistente leesbewerkingen.
Met transacties kunt u lezen uit niet-transactionele bronnen. Niet-transactionele bronnen bevatten externe tabellen met parquet-, Avro-, CSV- en JSON-bestandsindelingen en federatieve tabellen met JDBC. Als u niet-transactionele bronnen wilt lezen, verwijst u naar de bron op naam en gebruikt u de allow_nontransactional_read hint.
Binnen een transactie kunt u ook een query uitvoeren op de information_schema.
U kunt bestanden rechtstreeks lezen met de tabelwaardefunctie read_files.
Padgebaseerde toegang wordt niet ondersteund. Als u in plaats daarvan rechtstreeks naar een bestand verwijst per pad, zoals FROM parquet.`/path/to/data`, mislukt de transactie met een PATH_BASED_ACCESS fout.
In het volgende codevoorbeeld ziet u hoe u de hint voor een externe tabel gebruikt met behulp van JSON:
BEGIN TRANSACTION;
-- Non-transactional source, hint required
INSERT INTO transactional_table
SELECT col1, col2
FROM external_json_table
WITH (allow_nontransactional_read = true);
COMMIT;
Voorbeeld: niet-transactionele leesbewerking
In het volgende voorbeeld wordt een niet-transactionele leesbewerking van een externe tabel met behulp van Parquet getoond. Voor dit voorbeeld moet u een bestaande externe locatie met lees- en schrijftoegang hebben.
Zie Verbinding maken met een externe locatie van Azure Data Lake Storage Gen2 (ADLS Gen2).
Als u de Parquet-bron wilt registreren als een benoemde externe tabel, voert u het volgende uit:
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
Als u zowel een niet-transactionele Parquet-bron als een beheerde tabel wilt lezen met behulp van Delta Lake in een transactie, voert u het volgende uit:
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;
Transactieisolatie
Transacties maken herhaalbare leesbewerkingen in alle instructies mogelijk. Wanneer u een tabel in een transactie opent, legt Azure Databricks een consistente momentopname van die tabel vast bij eerste toegang. Alle volgende leesbewerkingen van die tabel maken gebruik van deze momentopname, zodat uw leesbewerkingen consistent blijven, zelfs als andere gebruikers dezelfde tabellen gelijktijdig wijzigen.
In het volgende voorbeeld legt de eerste query naar products in de transactie een consistente snapshot vast:
Niet-interactief
BEGIN ATOMIC
SELECT * FROM products WHERE product_id = 1001;
SELECT * FROM products WHERE product_id = 1001;
END;
Interactief
BEGIN TRANSACTION;
SELECT * FROM products WHERE product_id = 1001;
SELECT * FROM products WHERE product_id = 1001;
COMMIT;
Stel vervolgens dat een andere gebruiker de rij gelijktijdig bijwerkt voordat de tweede query begint:
UPDATE products SET price = 29.99 WHERE product_id = 1001;
Omdat de momentopname is vastgelegd bij eerste toegang, retourneert de tweede query products de oorspronkelijke rij, niet de bijgewerkte.
Conflictdetectie en gelijktijdigheid
Azure Databricks maakt gebruik van optimistisch gelijktijdigheidsbeheer. Transacties worden uitgevoerd zonder vergrendeling en conflicten worden gedetecteerd bij het bevestigen. Wanneer u doorvoert, controleert Azure Databricks of andere transacties dezelfde gegevens hebben gewijzigd nadat uw transactie is gestart. Als er conflicten bestaan, mislukt uw transactie. Voor niet-interactieve transacties gebeurt het terugdraaien ook automatisch. Voor interactieve transacties moet u expliciet uitvoeren ROLLBACK om de transactiestatus te wissen voordat u een nieuwe transactie start.
Niet-interactieve transacties ondersteunen gelijktijdigheid op rijniveau. Twee transacties kunnen verschillende rijen in hetzelfde gegevensbestand wijzigen zonder conflicteren wanneer gelijktijdigheid op rijniveau is ingeschakeld voor de doeltabellen.
Interactieve transacties ondersteunen gelijktijdigheid op tabelniveau.
Conflictscenario's
| Scenario | Beschrijving |
|---|---|
| Schrijf-schrijfconflicten | Twee transacties werken dezelfde rijen bij of verwijderen. |
| Schrijf-lezenconflicten | Een andere transactie heeft rijen gewijzigd die door uw transactie zijn gelezen. Alleen van toepassing op serialiseerbare isolatie. |
| Fantoomleesconflicten | Een andere transactie heeft nieuwe rijen toegevoegd die overeenkomen met een predicaat dat uw transactie heeft gelezen. Is van toepassing op zowel WriteSerializable als Serializable isolatie. |
| Conflicten met metagegevens | Een andere transactie heeft een tabelschema of eigenschappen gewijzigd. |
Zie Transactiemodi voor meer informatie over isolatieniveaus en conflictoplossing voor transacties. Zie Optimization recommendations on Azure Databricks voor informatie over isolatieniveaus en schrijfconflicten voor Delta Lake-tabellen in Azure Databricks.
Hoe transacties worden weergegeven in het Delta-logboek
Elke geslaagde transactie wordt weergegeven als één vermelding in het Delta-logboek van de tabel, ongeacht het aantal afzonderlijke instructies dat in de transactie is uitgevoerd. Dit maakt een schone audittrail mogelijk en vereenvoudigt terugdraaibewerkingen.
Afzonderlijke bewerkingen binnen een transactie zijn beschikbaar als JSON-metagegevens in de Delta-logboekvermelding voor de transactie.
Foutafhandeling en terugdraaien
In de volgende tabel wordt beschreven hoe fouten worden teruggedraaid voor beide transactietypen:
| Scenario | Gedrag voor niet-interactieve transacties | Gedrag voor interactieve transacties |
|---|---|---|
| Verklaringsfout | Elke commando die een fout veroorzaakt, veroorzaakt onmiddellijke automatische rollback. | U moet ROLLBACK expliciet uitvoeren om wijzigingen te negeren als de sessie nog steeds actief is. |
| Mislukte validatielogica of bedrijfsregels | Gebruik SIGNAL om een uitzondering op te werpen en een automatische terugdraaiing te activeren. |
Voer ROLLBACK uit om wijzigingen te negeren. |
| Sessieverbinding verbroken | De transactie wordt automatisch teruggedraaid. | De transactie wordt automatisch teruggedraaid. |
| Onderbreking | Wordt automatisch teruggedraaid na de totale duur van 48 uur. | Wordt automatisch teruggedraaid na 10 minuten inactiviteit of de totale duur van 48 uur (zie Beperkingen). De transactie wordt beëindigd zonder bijwerkingen, maar u moet ROLLBACK expliciet uitvoeren om de transactiestatus te wissen als de sessie nog steeds actief is. |
Voor interactieve transacties kunt u expliciet terugdraaien met behulp van de instructie TERUGDRAAIEN . Hiermee kunt u wijzigingen negeren op basis van validatielogica of bedrijfsregels, of na een fout in de instructie wanneer de sessie actief blijft.
Beste praktijken
Volg deze procedures om conflicten te verminderen en de transactieprestaties te optimaliseren.
Conflicten voorkomen
- Houd transacties kort: langlopende transacties vergroten de kans op conflicten en houden resources langer vast.
- Vroeg valideren: Controleer de voorwaarden aan het begin van een transactie om snel te mislukken.
-
Gebruiken
BEGIN ATOMICvoor gelijktijdigheid op rijniveau: niet-interactieve transacties (BEGIN ATOMIC ... END;) detecteren conflicten op rijniveau, waardoor conflicten worden verminderd vergeleken met de detectie op tabelniveau die interactieve transacties gebruiken. Zie niet-interactieve transacties. - Logica voor opnieuw proberen bouwen: een transactie kan op elk gewenst moment mislukken vanwege een conflict. Bouw logica voor opnieuw proberen in uw toepassing en voer mislukte transacties opnieuw uit met nieuwe gegevens.
- Start elke interactieve sessie met een terugdraaiactie: Voer ROLLBACK uit aan het begin van een interactieve sessie om de bestaande transactiestatus te wissen.
Transacties van verschillende clients gebruiken
Transacties werken in verschillende clientinterfaces:
-
SQL Editor en notebooks: Gebruik
BEGIN ATOMIC ... END;ofBEGIN TRANSACTION; ... COMMIT;syntaxis rechtstreeks in SQL-cellen, of gebruikspark.sql()in Python/Scala-notebooks. Zie transactiemodi. -
JDBC-toepassingen: JDBC-API-methoden (
setAutoCommit(false),commit(),rollback()) gebruiken met de Databricks JDBC-stuurprogrammaversie 3.0.5 en hoger. Zie voorbeeld: Transacties gebruiken. Zie Niet-ondersteunde JDBC-bewerkingen binnen transacties voor een lijst met niet-ondersteunde JDBC-bewerkingen. - ODBC-toepassingen: gebruik de Databricks ODBC-stuurprogrammaversie 2.10.0 en hoger. Zie Niet-ondersteunde ODBC-bewerkingen binnen transacties voor een lijst met niet-ondersteunde ODBC-bewerkingen.
-
Python-toepassingen: Gebruik de Databricks SQL-connector met
autocommit=False. Zie Databricks SQL Connector voor Python. Zie Niet-ondersteunde Python connectorbewerkingen voor een lijst met niet-ondersteunde Python connectorbewerkingen binnen transacties. - Statement Execution API: transacties uitvoeren met SQL-syntaxis via API-aanroepen. Zie Use with Statement Execution API.
Beperkingen
De volgende beperkingen gelden voor transacties:
| Beperking | Beschrijving |
|---|---|
| Interactieve transactieconflicten | Interactieve transacties (BEGIN TRANSACTION; ... DOORVOEREN;) gebruik conservatievere conflictdetectie dan niet-interactieve transacties en kan conflicteren op tabelniveau, met uitzondering van INSERT bewerkingen die niet worden gelezen uit de doeltabel. Gebruik niet-interactieve transacties (ATOMIC-samengestelde verklaring) wanneer conflictdetectie op rijniveau belangrijk is. Zie niet-interactieve transacties. |
| Doelen schrijven | U kunt alleen schrijven naar door Unity Catalog beheerde Delta- of Iceberg-tabellen waarvoor de catalogManaged tabelfunctie is ingeschakeld. Zie Cataloguscommits. |
| DDL-bewerkingen worden niet ondersteund | Voer DDL-bewerkingen uit, zoals CREATE TABLE, ALTER TABLEof DROP TABLE, buiten transacties. Zie Ondersteunde bewerkingen voor de bewerkingen die door transacties worden ondersteund. |
| Sommige metagegevensbewerkingen worden niet ondersteund | Sommige metagegevensbewerkingen werken niet binnen transacties, ongeacht het protocol. Dit omvat op Thrift RPC gebaseerde metagegevensaanroepen (zoals JDBC-methoden DatabaseMetaData en ODBC-catalogusfuncties), op SQL gebaseerde opdrachten waarmee objecten (zoals SHOW TABLES en SHOW DATABASES) worden opgesomd en SELECT query's op basis van systeemtabellen. Voer deze metagegevensbewerkingen buiten transacties uit. |
COPY INTO gelijktijdigheid |
Een transactie met een COPY INTO opdracht mislukt als een andere COPY INTO opdracht gelijktijdig wordt uitgevoerd om naar dezelfde tabel te schrijven en eerst doorvoeringen uit te voeren. |
Gelijktijdigheid op rijniveau voor MERGE |
Gelijktijdigheid op rijniveau voor MERGE bewerkingen wordt niet ondersteund in AWS GovCloud of in clusters met één gebruiker (toegewezen). Op deze platforms gebruiken bewerkingen MERGE gelijktijdigheid op tabelniveau. Zie concurrentie op rijniveau. |
| Tabel- en weergavelimieten | Een transactie kan lezen van en/of schrijven naar maximaal 100 tabellen, en kan lezen van maximaal 100 weergaven. Elke tabel kan binnen een transactie maximaal 100 tussenliggende commits bevatten. |
| Tijdreizen worden niet ondersteund | U kunt geen tijdreizen binnen een transactie gebruiken. |
| Time-out voor inactiviteit | Interactieve transacties worden teruggedraaid na 10 minuten inactiviteit. De transactie wordt beëindigd zonder bijwerkingen, maar u moet ROLLBACK expliciet uitvoeren om de transactiestatus te wissen als de sessie nog steeds actief is. |
| Afstamming | Transacties verzenden herkomst naarmate elke lees- en schrijfbewerking plaatsvindt. Afstammingsgebeurtenissen blijven behouden, zelfs als de transactie wordt teruggedraaid. |
| Maximale duur | Alle transacties worden automatisch teruggedraaid na de totale duur van 48 uur. Voor interactieve transacties wordt de transactie beëindigd zonder bijwerkingen, maar moet u ROLLBACK expliciet uitvoeren om de transactiestatus te wissen als de sessie nog actief is. |
| Vereiste voor gedeelde OpenSharing-tabellen | OpenSharing-providers moeten een tabel WITH HISTORYdelen om ontvangers toe te staan transacties erop uit te voeren. Ontvangers kunnen transacties uitvoeren met elk type berekening. |
| Rekenbeperkingen voor OpenSharing-ontvangers | Azure Databricks ontvangers kunnen alleen transacties uitvoeren op gedeelde weergaven, gerealiseerde weergaven, streamingtabellen en niet-Iceberg buitenlandse tabellen. Ontvangers in hetzelfde Azure Databricks-account als hun provider moeten gebruikmaken van gedeelde of serverloze berekeningen. Ontvangers in een ander account moeten serverloze berekeningen gebruiken. |
| Conflict met de OpenSharing-brontabel | Ontvangers van OpenSharing kunnen niet verwijzen naar een gedeelde weergave en een gedeelde tabel die verwijzen naar dezelfde brontabel binnen één transactie. |