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.
Delta Lake in Azure Databricks ondersteunt twee isolatieniveaus waarmee wordt bepaald hoe gelijktijdige bewerkingen in een bepaalde tabel werken:
| Isolatieniveau | Beschrijving |
|---|---|
| Serializerbaar | Het sterkste isolatieniveau. Zorgt ervoor dat vastgelegde schrijfbewerkingen en alle leesbewerkingen serializeerbaar zijn. Bewerkingen zijn toegestaan zolang er een seriële reeks is die, wanneer één voor één wordt uitgevoerd, hetzelfde resultaat genereert als in de tabel. Voor schrijfbewerkingen is deze seriële reeks hetzelfde als de volgorde die wordt weergegeven in de geschiedenis van de tabel. |
| WriteSerializable (standaard) | Een zwakker isolatieniveau dan Serializeerbaar. Zorgt ervoor dat alleen schrijfbewerkingen (geen leesbewerkingen) serialiseerbaar zijn. Dit is nog steeds sterker dan isolatie van momentopnamen . Biedt een goede balans tussen gegevensconsistentie en beschikbaarheid voor de meest voorkomende bewerkingen. |
Wanneer u het isolatieniveau wijzigt
Houd het standaard WriteSerializable isolatieniveau voor de meeste workloads.
Met WriteSerializable kan een DELETE, UPDATE, of MERGE die begint vóór een gelijktijdige insert nog steeds daarna committen. De rijen van de insert worden niet beïnvloed, zelfs als ze overeenkomen met de voorwaarde van de operatie. De tabelgeschiedenis vermeldt nog steeds de insert als eerste, dus de tabelinhoud komt niet overeen met het resultaat van het opnieuw afspelen van de commits in geschiedenisvolgorde. Zie voorbeeld: gelijktijdig verwijderen en invoegen.
Verander een tabel naar Serializable als je werklast dit resultaat niet aankan. Bijvoorbeeld, als een DELETE elke overeenkomende rij die bestaat op het moment dat deze commit wordt vastgelegd moet verwijderen, of als downstream-processen de tabelinhoud reconstrueren uit de commitvolgorde in de geschiedenis. Met Serializable mislukt de latere operatie door een conflict, en moet je het opnieuw proberen.
Serializable vermindert de doorvoer voor gelijktijdige schrijfopdrachten. Toevoegingen die de tabel niet lezen, conflicteren nooit onder WriteSerializable, maar kunnen wel conflicteren onder Serializable. Zie concurrentie op rijniveau.
Hoe isolatieniveaus van invloed zijn op leesbewerkingen
Leesbewerkingen maken altijd gebruik van isolatie van momentopnamen. Het isolatieniveau voor schrijven bepaalt of een lezer een momentopname van een tabel kan zien die volgens de geschiedenis nooit bestond.
- Serializeerbaar: Een lezer ziet altijd alleen tabellen die voldoen aan de geschiedenis
- WriteSerializable: een lezer kan een tabelstatus zien die niet bestaat in het Delta-logboek
Voorbeeld: Gelijktijdig verwijderen en invoegen
Overweeg een scenario waarin een langlopende verwijdertransactie en een invoegtransactie tegelijkertijd beginnen en de versie v0 lezen. De invoertransactie wordt eerst vastgelegd en creëert versie v1. Daarna probeert de verwijdertransactie het volgende door te voeren v2:
t0: deleteTxn_START
t1: insertTxn_START
t2: insertTxn_COMMIT(v1)
t3: deleteTxn_COMMIT(v2)
In dit scenario heeft deleteTxn de door insertTxn ingevoegde gegevens niet gezien en heeft hij ze niet verwijderd:
-
Serializable:
deleteTxnkan niet worden gecomiteerd en er ontstaat een conflict. -
WriteSerializable:
deleteTxnmag commiteren omdat de transacties kunnen worden geordend. De resulterende tabelstatus is alsofinsertTxnheeft plaatsgevonden nadeleteTxn, zodat de ingevoegde rijen deel uitmaken van de tabel. In de Delta-geschiedenis wordt echter de fysieke doorvoervolgorde (insertTxnv1 vóórdeleteTxnv2) weergegeven.
Het isolatieniveau instellen
Om het isolatieniveau in te stellen, gebruik je het ALTER TABLE commando:
ALTER TABLE <table-name> SET TBLPROPERTIES ('delta.isolationLevel' = <level-name>)
Waar <level-name> is Serializable of WriteSerializable.
Voorbeeld:
-- Change from default WriteSerializable to Serializable
ALTER TABLE my_table SET TBLPROPERTIES ('delta.isolationLevel' = 'Serializable')
Wanneer voert Delta Lake een commit uit zonder de tabel te lezen?
Delta Lake- INSERT of append-bewerkingen lezen de tabelstatus niet voordat de commit plaatsvindt, als aan deze voorwaarden is voldaan:
- Logica wordt uitgedrukt met behulp van
INSERTSQL-logica of toevoegmodus - Logica bevat geen subquery's of voorwaarden die verwijzen naar de tabel waarop de schrijfbewerking is gericht
Net als bij andere doorvoeringen gebruikt Delta Lake metagegevens van transactielogboeken om tabelversies bij doorvoer te valideren en op te lossen, maar er wordt geen versie van de tabel daadwerkelijk gelezen.
Opmerking
Veel veelvoorkomende patronen gebruiken MERGE bewerkingen om gegevens in te voegen op basis van tabelvoorwaarden. Hoewel het mogelijk is om deze logica opnieuw te schrijven met behulp van INSERT instructies, hebben deze instructies dezelfde gelijktijdigheidsbeperkingen als MERGEwanneer een voorwaardelijke expressie verwijst naar een kolom in de doeltabel.