Kommentar
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Delta Lake på Azure Databricks stöder två isoleringsnivåer som styr hur samtidiga åtgärder i en viss tabell interagerar:
| Isoleringsnivå | Beskrivning |
|---|---|
| Serialiserbar | Den starkaste isoleringsnivån. Säkerställer att de incheckade skrivåtgärderna och alla läsningar är Serializable. Åtgärder tillåts så länge det finns en seriesekvens som, när den körs en i taget, genererar samma resultat som i tabellen. För skrivåtgärder är den här seriesekvensen samma som den ordning som visas i tabellens historik. |
| WriteSerializable (standard) | En svagare isoleringsnivå än Serializable. Säkerställer att endast skrivåtgärder (inte läsningar) är serialiserbara. Detta är fortfarande starkare än ögonblicksbildisolering . Ger en bra balans mellan datakonsekvens och tillgänglighet för de vanligaste åtgärderna. |
Hur isoleringsnivåer påverkar läsoperationer
Läsåtgärder använder alltid ögonblicksbildisolering. Skrivisoleringsnivån avgör om en läsare kan se en ögonblicksbild av en tabell som enligt historiken "aldrig existerade".
- Serialiserbar: En läsare ser alltid endast tabeller som överensstämmer med historiken
- WriteSerializable: En läsare kan se ett tabelltillstånd som inte finns i Delta-loggen
Exempel: Samtidig borttagning och infoga
Tänk dig ett scenario där en tidskrävande borttagningstransaktion och en infogad transaktion startar samtidigt och läser version v0. Infogningstransaktionen begås först och skapar version v1. Därefter försöker borttagningstransaktionen att slutföra v2:
t0: deleteTxn_START
t1: insertTxn_START
t2: insertTxn_COMMIT(v1)
t3: deleteTxn_COMMIT(v2)
I det här scenariot deleteTxn såg du inte de data som infogades av insertTxn och tog inte bort dem:
-
Serialiserbar:
deleteTxntillåts inte att göra en commit och en konflikt uppstår -
WriteSerializable:
deleteTxntillåts att begå eftersom transaktionerna kan ordnas. Det resulterande tabelltillståndet är som ominsertTxninträffade efterdeleteTxn, så de infogade raderna är en del av tabellen. Deltahistoriken visar dock den fysiska kommitteringsordningen (insertTxnvid v1 föredeleteTxnvid v2).
Ange isoleringsnivå
Ange isoleringsnivån med kommandot ALTER TABLE :
ALTER TABLE <table-name> SET TBLPROPERTIES ('delta.isolationLevel' = <level-name>)
Var <level-name> är Serializable eller WriteSerializable.
Ett exempel:
-- Change from default WriteSerializable to Serializable
ALTER TABLE my_table SET TBLPROPERTIES ('delta.isolationLevel' = 'Serializable')
När committerar Delta Lake utan att läsa tabellen?
Delta Lake INSERT eller tilläggsåtgärder läser inte tabelltillståndet innan de genomförs om följande villkor är uppfyllda:
- Logik uttrycks med SQL-logik
INSERTeller tilläggsläge - Logik innehåller inga underfrågor eller villkor som refererar till tabellen som skrivåtgärden riktar sig till
Precis som med andra incheckningar använder Delta Lake transaktionsloggmetadata för att verifiera och lösa tabellversioner vid incheckning, men ingen version av tabellen läses faktiskt.
Anmärkning
Många vanliga mönster använder MERGE åtgärder för att infoga data baserat på tabellvillkor. Även om det kan vara möjligt att skriva om den här logiken med hjälp av INSERT instruktioner, har dessa uttryck samma samtidighetsbegränsningar som MERGEom några villkorsuttryck refererar till en kolumn i måltabellen.
Nästa steg
- Samtidighet på radnivå
- Transactions
- Isoleringsnivåer och skrivkonflikter