Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Souběžnost na úrovni řádků snižuje konflikty mezi souběžnými operacemi zápisu tím, že detekuje změny na úrovni řádku a automaticky řeší konflikty, ke kterým dochází při souběžné aktualizaci zápisu nebo odstranění různých řádků ve stejném datovém souboru.
Požadavky na souběžnost na úrovni řádků
Tabulky nepodporují souběžnost na úrovni řádků, pokud mají definované oddíly nebo nemají povolené vektory odstranění. Souběžnost na úrovni řádků vyžaduje Databricks Runtime 14.2 a vyšší.
Tabulky s oddíly nepodporují konkurenci na úrovni řádků, ale při povolení vektorů odstranění se mohou vyhnout konfliktům mezi OPTIMIZE a všemi ostatními operacemi zápisu. Viz Omezení souběžnosti na úrovni řádků.
Informace o verzích Databricks Runtime starších než 14.2 najdete v tématu Chování při souběžnosti na úrovni řádků (starší verze).
Poznámka:
MERGE INTO Podpora souběžnosti na úrovni řádků vyžaduje Photon v Databricks Runtime 14.2. Ve službě Databricks Runtime 14.3 LTS a novější není Photon vyžadován.
Matice konfliktů se souběžností na úrovni řádků
Následující tabulka ukazuje, které páry operací zápisu můžou kolidovat v jednotlivých úrovních izolace s povolenou souběžností na úrovni řádků:
| INSERT (1) | UPDATEVYMAZATMERGE INTO | OPTIMIZE | |
|---|---|---|---|
| INSERT | Nemůže být v rozporu | ||
| UPDATEVYMAZATMERGE INTO | Nelze zpracovat konflikt v WriteSerializable. Při úpravě stejného řádku může dojít ke konfliktu v režimu Serializable. | Může dojít ke konfliktu při úpravě stejného řádku. | |
| OPTIMIZE | Nemůže být v rozporu | Může dojít ke konfliktu použitím ZORDER BY. Nemůže to být v rozporu jinak. |
Může dojít ke konfliktu použitím ZORDER BY. Nemůže to být v rozporu jinak. |
(1) Všechny INSERT operace v této tabulce popisují operace připojení, které před potvrzením nepřečtou žádná data ze stejné tabulky.
INSERT operace, které obsahují poddotazy, které čtou stejnou tabulku, podporují stejnou souběžnost jako MERGE.
Poznámka:
- Tabulky se sloupci identit nepodporují souběžné transakce. Viz Použití sloupců identit v Delta Lake.
-
REORGoperace mají sémantiku izolace stejnou jakoOPTIMIZEpři přepisování datových souborů. Když použijeteREORGke spuštění upgradu, dojde ke změně protokolů tabulek, což je v rozporu se všemi probíhajícími operacemi.
Konflikty zápisu při absenci konkurence na úrovni řádků
Tabulky nepodporují souběžnost na úrovni řádků, pokud mají definované oddíly nebo nemají povolené vektory odstranění. Databricks Runtime 14.2 nebo vyšší se vyžaduje pro souběžnost na úrovni řádků.
Konfliktní matice bez souběžnosti na úrovni řádků
Následující tabulka ukazuje, které páry operací zápisu můžou kolidovat v jednotlivých úrovních izolace:
| INSERT (1) | UPDATEVYMAZATMERGE INTO | OPTIMIZE | |
|---|---|---|---|
| INSERT | Nemůže být v rozporu | ||
| UPDATEVYMAZATMERGE INTO | Nelze zpracovat konflikt v WriteSerializable. Může být v konfliktu se serializovatelností. Viz Zabránění konfliktům pomocí dělení. | Může dojít ke konfliktu v Serializable a WriteSerializable. Viz Zabránění konfliktům pomocí dělení. | |
| OPTIMIZE | Nemůže být v rozporu | Nelze v tabulkách kolidovat s povolenými vektory odstranění, pokud ZORDER BY se nepoužívá. Může se dostat do konfliktu jinak. |
Nelze v tabulkách kolidovat s povolenými vektory odstranění, pokud ZORDER BY se nepoužívá. Může se dostat do konfliktu jinak. |
(1) Všechny INSERT operace v této tabulce popisují operace přidání, které před potvrzením nepřečtou žádná data ze stejné tabulky.
INSERT operace, které obsahují poddotazy, které čtou stejnou tabulku, podporují stejnou souběžnost jako MERGE.
Poznámka:
- Tabulky se sloupci identit nepodporují souběžné transakce. Viz Použití sloupců identit v Delta Lake.
-
REORGoperace mají sémantiku izolace stejnou jakoOPTIMIZEpři přepisování datových souborů. Když použijeteREORGke spuštění upgradu, dojde ke změně protokolů tabulek, což je v rozporu se všemi probíhajícími operacemi.
Omezení souběžnosti na úrovni řádků
Omezení platí pro souběžnost na úrovni řádků. Řešení konfliktů u následujících operací se řídí obvyklou souběžností pro konflikty zápisu. Viz Konflikty zápisu bez souběžnosti na úrovni řádků.
| Omezení | Description |
|---|---|
| Komplexní podmíněné klauzule | Podmínky pro komplexní datové typy (struktury, pole, mapy), nedeterministické výrazy, poddotazy a korelované poddotazy |
MERGE požadavek na predikát |
V Databricks Runtime 14.2 MERGE musí příkazy použít explicitní predikát v cílové tabulce k filtrování řádků odpovídajících zdrojové tabulce. |
| Výkonový kompromis | Detekce konfliktů na úrovni řádků může zvýšit celkovou dobu provádění. Při mnoha souběžných transakcích zapisovač upřednostňuje latenci oproti řešení konfliktů. |
Platí také všechna omezení pro vektory odstranění. Viz Omezení.
Vyhněte se konfliktům pomocí dělení
Ve všech případech označených jako "může kolidovat" v maticích konfliktů dojde ke konfliktu pouze v případě, že dvě operace ovlivňují stejnou sadu souborů. Pokud chcete vytvořit dvě sady souborů oddělené, rozdělte tabulku podle stejných sloupců, které se používají v podmínkách operací.
Příklad:
Pokud tabulka není rozdělena podle data, příkazy UPDATE table WHERE date > '2010-01-01' ... a DELETE table WHERE date < '2010-01-01' konfliktují, protože oba se mohou pokusit upravit stejné soubory. Rozdělením tabulky podle date se vyhnete konfliktu.
Poznámka:
Dělení tabulky podle sloupce s vysokou kardinalitou může vést k problémům s výkonem kvůli velkému počtu podadresářů.
Příklad: Jak se vyhnout konfliktům s explicitními filtry oddílů
Tato výjimka se často vyvolá během souběžných DELETEUPDATEoperací nebo MERGE operací, které mohou číst stejný oddíl i při aktualizaci různých oddílů. Explicitně stanovte oddělení v podmínkách provozu.
// Problem: Condition can scan the entire table
deltaTable.as("t").merge(
source.as("s"),
"s.user_id = t.user_id AND s.date = t.date AND s.country = t.country")
.whenMatched().updateAll()
.whenNotMatched().insertAll()
.execute()
// Solution: Add explicit partition filters
deltaTable.as("t").merge(
source.as("s"),
"s.user_id = t.user_id AND s.date = t.date AND s.country = t.country AND t.date = '" + date + "' AND t.country = '" + country + "'")
.whenMatched().updateAll()
.whenNotMatched().insertAll()
.execute()
Výjimky při konfliktech
Když dojde ke konfliktu transakcí, zjistíte jednu z následujících výjimek:
Výjimka při souběžném připojování
Tato výjimka nastane, když souběžná operace přidá soubory ve stejném oddílu (nebo kdekoli v tabulce bez oddílů), který vaše operace přečte. Doplňky souborů můžou být způsobeny operacemi INSERT, DELETE, UPDATE, nebo MERGE operacemi.
S výchozí úrovní izolace WriteSerializable nejsou soubory přidané slepými INSERT operacemi (operacemi, které připojují data bez čtení dat) v konfliktu s žádnou operací. Pokud je úroveň izolace serializovatelná, můžou být slepá připojení v konfliktu.
Důležité
Slepá připojení mohou při režimu WriteSerializable kolidovat, když více souběžných operací DELETE, UPDATE, nebo MERGE může odkazovat na hodnoty vložené slepými připojeními. Chcete-li se tomu vyhnout:
- Ujistěte se, že souběžné operace
DELETE,UPDATE, neboMERGEnečtou připojená data. - Mít maximálně jednu
DELETE,UPDATEneboMERGEoperaci, která může číst připojená data
ConcurrentDeleteReadException
K této výjimce dochází, když souběžná operace odstraní soubor, který operace přečte. Mezi běžné příčiny patří DELETE, UPDATE nebo MERGE operace, které přepisují soubory.
ConcurrentDeleteDeleteException
K této výjimce dochází, když souběžná operace odstraní také soubor, který vaše operace odstraní. Příčinou můžou být dvě souběžné operace komprimace, které přepisují stejné soubory.
MetadataChangedException
K této výjimce dochází, když souběžná transakce aktualizuje metadata tabulky Delta. Mezi běžné příčiny patří ALTER TABLE operace nebo zápisy, které aktualizují schéma tabulky.
VýjimkaSoučasnýchTransakcí
K této výjimce dochází, pokud je dotaz streamování používající stejné umístění kontrolního bodu spuštěn vícekrát souběžně a pokusí se zapisovat do tabulky Delta současně. Nikdy současně neprovozujte dva streamovací dotazy se stejným umístěním kontrolního bodu.
VýjimkaZměnaProtokolu
K této výjimce může dojít v těchto případech:
- Vaše tabulka Delta se upgraduje na novou verzi protokolu (možná budete muset upgradovat databricks Runtime).
- Více zapisovačů vytváří nebo nahrazuje tabulku ve stejnou dobu.
- Více zapisovačů zapisuje současně na prázdnou cestu k souboru.
Viz kompatibilita a protokoly funkcí Delta Lake.
Chování souběžnosti na úrovni řádků (starší verze)
Tato část popisuje chování verze Preview pro souběžnost na úrovni řádků v Databricks Runtime 14.1 a níže.
| Verze modulu Databricks Runtime | Chování |
|---|---|
| Databricks Runtime 13.3 LTS a vyšší | Tabulky s liquid clusteringem automaticky umožňují souběžnost na úrovni řádku. |
| Databricks Runtime 14.0 a 14.1 | Povolení souběžnosti na úrovni řádků pro tabulky s vektory odstranění s využitím níže uvedené konfigurace |
| Databricks Runtime 14.1 a novější | Výpočty bez technologie Photon podporují pouze souběžnost na úrovni řádků u operací DELETE. |
Povolení souběžnosti na úrovni řádků v Databricks Runtime 14.0 a 14.1:
spark.databricks.delta.rowLevelConcurrencyPreview = true
Řádková souběžnost vždy vyžaduje vektory odstranění.