Notatka
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Współbieżność na poziomie wiersza zmniejsza konflikty między współbieżnych operacji zapisu, wykrywając zmiany na poziomie wiersza i automatycznie rozwiązując konflikty występujące podczas współbieżnej aktualizacji zapisu lub usuwania różnych wierszy w tym samym pliku danych.
Wymagania dotyczące współbieżności na poziomie wiersza
Tabele nie obsługują współbieżności na poziomie wiersza, jeśli mają zdefiniowane partycje lub nie mają włączonych wektorów usuwania. Współbieżność na poziomie wiersza wymaga środowiska Databricks Runtime 14.2 lub nowszego.
Tabele z partycjami nie obsługują współbieżności na poziomie wiersza, ale nadal mogą unikać konfliktów między OPTIMIZE a wszystkimi innymi operacjami zapisu, gdy wektory usuwania są włączone. Zobacz Ograniczenia dotyczące współbieżności na poziomie wiersza.
W przypadku wersji środowiska Databricks Runtime przed 14.2 zobacz Zachowanie podglądu współbieżności na poziomie wiersza (starsza wersja).
Uwaga / Notatka
MERGE INTO Obsługa współbieżności na poziomie wiersza wymaga aplikacji Photon w środowisku Databricks Runtime 14.2. W środowisku Databricks Runtime 14.3 LTS i nowszym aplikacja Photon nie jest wymagana.
Macierz konfliktów ze współbieżnością na poziomie wiersza
W poniższej tabeli przedstawiono, które pary operacji zapisu mogą powodować konflikty na każdym poziomie izolacji z włączoną współbieżnością na poziomie wiersza:
| INSERT (1) | UPDATE, USUŃ, MERGE INTO | OPTIMIZE | |
|---|---|---|---|
| INSERT | Nie może być konfliktu | ||
| UPDATE, USUŃ, MERGE INTO | Nie może wystąpić konflikt w WriteSerializable. Może powodować konflikt w przypadku serializacji podczas modyfikowania tego samego wiersza. | Może powodować konflikt podczas modyfikowania tego samego wiersza. | |
| OPTIMIZE | Nie może być konfliktu | Może powodować konflikt, gdy ZORDER BY jest używany. Inaczej nie może dojść do konfliktu. |
Może powodować konflikt, gdy ZORDER BY jest używany. Inaczej nie może dojść do konfliktu. |
(1) Wszystkie INSERT operacje w tej tabeli opisują operacje dodawania, które nie odczytują żadnych danych z tej samej tabeli przed zatwierdzeniem.
INSERT operacje zawierające podzapytania odczytujące tę samą tabelę obsługują tę samą współbieżność co MERGE.
Uwaga / Notatka
- Tabele z kolumnami tożsamości nie obsługują transakcji współbieżnych. Zobacz Korzystanie z kolumn tożsamości w Delta Lake.
-
REORGoperacje mają semantyki izolacji identyczną jakOPTIMIZEpodczas ponownego zapisywania plików danych. W przypadku zastosowaniaREORGuaktualnienia, protokoły tabel zmieniają się, co stwarza konflikt ze wszystkimi trwającymi operacjami.
Konflikty zapisu bez współbieżności na poziomie poszczególnych wierszy
Tabele nie obsługują współbieżności na poziomie wiersza, jeśli mają zdefiniowane partycje lub nie mają włączonych wektorów usuwania. Środowisko Databricks Runtime 14.2 lub nowsze jest wymagane do współbieżności na poziomie wiersza.
Macierz konfliktów bez współbieżności na poziomie wiersza
W poniższej tabeli przedstawiono, które pary operacji zapisu mogą powodować konflikty na każdym poziomie izolacji:
| INSERT (1) | UPDATE, USUŃ, MERGE INTO | OPTIMIZE | |
|---|---|---|---|
| INSERT | Nie może być konfliktu | ||
| UPDATE, USUŃ, MERGE INTO | Nie może wystąpić konflikt w WriteSerializable. Może powodować konflikt w ramach Serializable. Zobacz Unikanie konfliktów przy użyciu partycjonowania. | Może wystąpić konflikt pomiędzy Serializable a WriteSerializable. Zobacz Unikanie konfliktów przy użyciu partycjonowania. | |
| OPTIMIZE | Nie może być konfliktu | Nie ma możliwości konfliktu w tabelach z włączonymi wektorami usuwania, chyba że używany jest ZORDER BY. W przeciwnym razie może powodować konflikt. |
Nie może dojść do konfliktu w tabelach, które mają włączone wektory usuwania, chyba że ZORDER BY jest używany. W przeciwnym razie może powodować konflikt. |
(1) Wszystkie INSERT operacje w tej tabeli dotyczą operacji dołączania, które nie odczytują danych z tej samej tabeli przed zatwierdzeniem.
INSERT operacje zawierające podzapytania odczytujące tę samą tabelę obsługują tę samą współbieżność co MERGE.
Uwaga / Notatka
- Tabele z kolumnami tożsamości nie obsługują transakcji współbieżnych. Zobacz Korzystanie z kolumn tożsamości w Delta Lake.
-
REORGoperacje mają semantykę izolacji identyczną jakOPTIMIZEpodczas przepisywania plików danych. W przypadku zastosowaniaREORGuaktualnienia, protokoły tabel zmieniają się, co stwarza konflikt ze wszystkimi trwającymi operacjami.
Ograniczenia współbieżności na poziomie wiersza
Ograniczenia dotyczą współbieżności na poziomie wiersza. W przypadku następujących operacji rozwiązywanie konfliktów odbywa się zgodnie z normalnym trybem współbieżnego przetwarzania podczas konfliktów zapisu. Zobacz Konflikty zapisu przy braku współbieżności na poziomie wierszy.
| Limitation | Opis |
|---|---|
| Złożone klauzule warunkowe | Warunki dotyczące złożonych typów danych (struktur, tablic, map), wyrażeń niedeterministycznych, podzapytania i skorelowanych podzapytania |
MERGE wymaganie predykatu |
W środowisku Databricks Runtime 14.2 MERGE polecenia muszą używać jawnego predykatu w tabeli docelowej, aby filtrować wiersze, które odpowiadają tabeli źródłowej. |
| Kompromis w zakresie wydajności | Wykrywanie konfliktów na poziomie wiersza może zwiększyć całkowity czas wykonywania. W przypadku wielu równoczesnych transakcji piszący priorytetuje niskie opóźnienia kosztem rozwiązywania konfliktów. |
Obowiązują również wszystkie ograniczenia dotyczące wektorów usuwania. Zobacz Ograniczenia.
Unikanie konfliktów przy użyciu partycjonowania
We wszystkich przypadkach oznakowanych jako "może powodować konflikt" w macierzach konfliktów, konflikt występuje tylko wtedy, gdy obie operacje mają wpływ na ten sam zestaw plików. Aby rozdzielić dwa zestawy plików, podziel tabelę na partycje według tych samych kolumn używanych w warunkach operacyjnych.
Example:
Polecenia UPDATE table WHERE date > '2010-01-01' ... i DELETE table WHERE date < '2010-01-01' będą w konflikcie, jeśli tabela nie jest partycjonowana według daty, ponieważ oba mogą próbować zmodyfikować te same pliki. Partycjonowanie tabeli z użyciem date unika konfliktu.
Uwaga / Notatka
Partycjonowanie tabeli według kolumny o wysokiej kardynalności może prowadzić do problemów z wydajnością ze względu na dużą liczbę podkatalogów.
Przykład: Unikanie konfliktów z jawnymi filtrami partycji
Ten wyjątek jest często zgłaszany podczas współbieżnych operacji DELETE, UPDATE lub MERGE, które mogą odczytywać tę samą partycję, nawet gdy aktualizowane są różne partycje. Ustaw separację jawną w warunku operacji:
// 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()
Wyjątki od konfliktów
W przypadku wystąpienia konfliktu transakcji obserwujesz jeden z następujących wyjątków:
ConcurrentAppendException
Wyjątek ten występuje, gdy współbieżna operacja dodaje pliki w tej samej partycji (lub w dowolnym miejscu w niepartycjonowanej tabeli), którą odczytuje operacja. Dodatki plików mogą być spowodowane operacjami INSERT, DELETE, UPDATElub MERGE .
W przypadku domyślnego poziomu izolacji WriteSerializable pliki dodawane przez operacje ślepe INSERT (operacje dołączające dane bez odczytywania danych) nie powodują konfliktu z żadną operacją. Jeśli poziom izolacji jest Serializable, ślepe dodania mogą powodować konflikt.
Ważna
Ślepe dołączenia mogą powodować konflikt w trybie WriteSerializable, jeśli wiele współbieżnych operacji DELETE, UPDATE lub MERGE może odnosić się do wartości wstawionych przez ślepe dołączenia. Aby tego uniknąć:
- Upewnij się, że współbieżne operacje
DELETE,UPDATElubMERGEnie odczytują dołączonych danych - Miej co najwyżej jedną operację
DELETE,UPDATE, lubMERGE, która może odczytywać dołączone dane.
ConcurrentDeleteReadException
Ten wyjątek występuje, gdy operacja współbieżna usuwa plik odczytany przez operację. Typowe przyczyny to DELETE, UPDATElub MERGE operacje, które ponownie zapisują pliki.
ConcurrentDeleteDeleteException
Ten wyjątek występuje, gdy operacja współbieżna usuwa również plik, który operacja usuwa. Może to być spowodowane przez dwie współbieżne operacje kompaktowania przepisujące te same pliki.
MetadataChangedException
Ten wyjątek występuje, gdy współbieżna transakcja aktualizuje metadane tabeli delty. Typowe przyczyny to ALTER TABLE operacje lub zapisy, które aktualizują schemat tabeli.
ConcurrentTransactionException
Ten wyjątek występuje, jeśli zapytanie przesyłane strumieniowo przy użyciu tej samej lokalizacji punktu kontrolnego jest uruchamiane wiele razy jednocześnie i próbuje zapisać w tabeli delty w tym samym czasie. Nigdy nie uruchamiaj dwóch zapytań przesyłanych strumieniowo z tą samą lokalizacją punktu kontrolnego jednocześnie.
ProtocolChangedException (WyjątekZmianyProtokołu)
Ten wyjątek może wystąpić, gdy:
- Tabela delta została uaktualniona do nowej wersji protokołu (może być konieczne uaktualnienie środowiska Databricks Runtime)
- Wiele autorów tworzy lub zastępuje tabelę w tym samym czasie
- Wielu autorów zapisuje w pustej ścieżce w tym samym czasie
Zobacz kompatybilność funkcji i protokoły Delta Lake.
Zachowanie podglądu współbieżności na poziomie wiersza (starsza wersja)
W tej sekcji opisano zachowania podglądu współbieżności na poziomie wiersza w środowisku Databricks Runtime 14.1 lub nowszym.
| Wersja usługi Databricks Runtime | Zachowanie |
|---|---|
| Databricks Runtime 13.3 LTS i nowsze | Tabele z płynnym klastrowaniem automatycznie włączają współbieżność na poziomie wiersza |
| Databricks Runtime 14.0 i 14.1 | Włącz współbieżność na poziomie wiersza dla tabel z wektorami usuwania przy użyciu poniższej konfiguracji |
| Środowisko Databricks Runtime 14.1 i starsze | Obliczenia inne niż Photon obsługują tylko współbieżność na poziomie wiersza dla DELETE operacji |
Aby włączyć współbieżność na poziomie wiersza w środowisku Databricks Runtime 14.0 i 14.1:
spark.databricks.delta.rowLevelConcurrencyPreview = true
Współbieżność na poziomie wiersza zawsze wymaga wektorów usuwania.