Sdílet prostřednictvím


Úrovně izolace (WriteSerializable a Serializable)

Delta Lake v Azure Databricks podporuje dvě úrovně izolace, které řídí interakci souběžných operací v dané tabulce:

Úroveň izolace Description
Serializovatelný Nejsilnější úroveň izolace. Zajišťuje to, že potvrzené operace zápisu a všechny operace čtení jsou serializovatelné. Operace jsou povoleny, pokud existuje sériová sekvence, která při spuštění po jednom vygeneruje stejný výsledek jako v tabulce. U operací zápisu je tato sériová sekvence stejná jako pořadí v historii tabulky.
WriteSerializable (výchozí) Slabší úroveň izolace než serializovatelná. Zajišťuje, že serializovatelné jsou pouze operace zápisu (ne čtení). Stále je to silnější než izolace Snapshot. Poskytuje dobrou rovnováhu mezi konzistencí dat a dostupností pro nejběžnější operace.

Vliv úrovní izolace na čtení

Operace čtení vždy používají izolaci snímků. Úroveň izolace zápisu určuje, jestli čtenář vidí snímek tabulky, která podle historie "nikdy neexistovala".

  • Serializovatelné: Čtenář vždy vidí pouze tabulky, které odpovídají historii.
  • WriteSerializable: Čtenář může zobrazit stav tabulky, který v protokolu Delta neexistuje.

Příklad: Souběžné odstranění a vložení

Představte si scénář, kdy dlouhotrvající transakce odstranění a transakce vložení se spouští ve stejnou dobu a čtecí verze v0. Transakce vložení se nejprve potvrdí a vytvoří verzi v1. Po provedení transakce odstranění se pokusí potvrdit v2:

t0: deleteTxn_START
t1: insertTxn_START
t2: insertTxn_COMMIT(v1)
t3: deleteTxn_COMMIT(v2)

V tomto scénáři deleteTxn neviděla data vložená insertTxn a neodstranil(a) je:

  • Serializable: deleteTxn není povoleno provést potvrzení a dojde ke konfliktu
  • WriteSerializable: deleteTxn je povoleno potvrdit, protože transakce lze uspořádat. Výsledný stav tabulky je stejný, jako kdyby k insertTxn došlo následně po deleteTxn, takže vložené řádky jsou integrovány do tabulky. Historie delta ale zobrazuje pořadí fyzického potvrzení (insertTxn v1 před deleteTxn v2).

Nastavení úrovně izolace

Nastavte úroveň izolace pomocí ALTER TABLE příkazu:

ALTER TABLE <table-name> SET TBLPROPERTIES ('delta.isolationLevel' = <level-name>)

Kde <level-name> je Serializable nebo WriteSerializable.

Příklad:

-- Change from default WriteSerializable to Serializable
ALTER TABLE my_table SET TBLPROPERTIES ('delta.isolationLevel' = 'Serializable')

Kdy Delta Lake provádí změny bez načtení tabulky?

Operace Delta Lake INSERT nebo operace připojení nečtou stav tabulky před potvrzením, pokud jsou splněny následující podmínky:

  1. Logika se vyjadřuje pomocí INSERT logiky SQL nebo režimu připojení.
  2. Logika neobsahuje žádné poddotazy ani podmíněné výrazy, které odkazují na tabulku cílenou operací zápisu.

Stejně jako u jiných potvrzení používá Delta Lake metadata transakčního protokolu k ověření a překladu verzí tabulek při potvrzení, ale žádná verze tabulky se ve skutečnosti nečte.

Poznámka:

Mnoho běžných vzorů používá MERGE operace k vkládání dat na základě podmínek tabulky. I když může být možné přepsat tuto logiku pomocí INSERT příkazů, pokud některé podmíněné výrazy odkazují na sloupec v cílové tabulce, mají tyto příkazy stejná omezení souběžnosti jako MERGE.

Další kroky