Transactions

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:
  • 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 ATOMIC voor 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:

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.

Aanvullende informatiebronnen