Poziomy izolacji

Poziom izolacji tabeli definiuje stopień, w jakim transakcja musi być odizolowana od modyfikacji wykonywanych przez transakcje współbieżne. Usługa Delta Lake w usłudze Azure Databricks obsługuje dwa poziomy izolacji: Serializable i WriteSerializable.

  • Serializowalny: najsilniejszy poziom izolacji. Gwarantuje to, że zatwierdzone operacje zapisu i wszystkie operacje odczytu można serializować. Operacje są dozwolone tak długo, jak istnieje sekwencja szeregowa wykonywania ich jednorazowo, która generuje taki sam wynik, jak pokazano w tabeli. W przypadku operacji zapisu sekwencja szeregowa jest dokładnie taka sama jak w historii tabeli.

  • WriteSerializable (wartość domyślna): słabszy poziom izolacji niż serializowalny. Zapewnia tylko, że operacje zapisu (czyli nie odczyty) można serializować. Jest to jednak nadal silniejsze niż izolacja migawki . WriteSerializable jest domyślnym poziomem izolacji, ponieważ zapewnia doskonałą równowagę spójności danych i dostępności dla najbardziej typowych operacji.

    W tym trybie zawartość tabeli delty może się różnić od oczekiwanej od sekwencji operacji widocznych w historii tabeli. Jest to spowodowane tym, że ten tryb umożliwia niektórym parom współbieżnych zapisów (np. operacje X i Y), tak aby wynik był taki, jakby Y został wykonany przed X (czyli z możliwością serializacji między nimi), mimo że historia wykazała, że Y zostało zatwierdzone po X. Aby nie zezwalać na zmiana kolejności, ustaw poziom izolacji tabeli na możliwy do serializacji, aby spowodować niepowodzenie tych transakcji.

Operacje odczytu zawsze używają izolacji migawek. Poziom izolacji zapisu określa, czy czytelnik może zobaczyć migawkę tabeli, że zgodnie z historią "nigdy nie istniało".

W przypadku poziomu serializowalnego czytelnik zawsze widzi tylko tabele zgodne z historią. W przypadku poziomu WriteSerializable czytelnik może zobaczyć tabelę, która nie istnieje w dzienniku delty.

Rozważmy na przykład txn1, długotrwały usuwanie i txn2, który wstawia dane usunięte przez txn1. txn2 i txn1 ukończone i są rejestrowane w tej kolejności w historii. Zgodnie z historią dane wstawione w txn2 nie powinny istnieć w tabeli. W przypadku poziomu serializowalnego czytnik nigdy nie widziałby danych wstawionych przez txn2. Jednak na poziomie WriteSerializable czytnik może w pewnym momencie zobaczyć dane wstawione przez txn2.

Aby uzyskać więcej informacji na temat typów operacji, które mogą powodować konflikt ze sobą na każdym poziomie izolacji i możliwych błędów, zobacz Kontrola współbieżności.

Ustawianie poziomu izolacji

Poziom izolacji można ustawić przy użyciu ALTER TABLE polecenia .

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

gdzie <level-name> to lub WriteSerializableSerializable .

Aby na przykład zmienić poziom izolacji z domyślnej WriteSerializable na Serializable, uruchom polecenie:

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