Transakcje i tryby blokowania w usłudze Azure Service Fabric Reliable Collections
Transakcja
Transakcja to sekwencja operacji wykonywanych jako pojedyncza jednostka logiczna pracy. Wykazuje on wspólne właściwości ACID (niepodzielność, spójność, izolacja, trwałość) transakcji bazy danych:
- Niepodzielność: transakcja musi być jednostką niepodzielnej pracy. Innymi słowy, wszystkie jego modyfikacje danych są wykonywane lub żadna z nich nie jest wykonywana.
- Spójność: po zakończeniu transakcja musi pozostawić wszystkie dane w spójnym stanie. Wszystkie wewnętrzne struktury danych muszą być poprawne na końcu transakcji.
- Izolacja: modyfikacje wprowadzone przez transakcje współbieżne muszą być odizolowane od modyfikacji wprowadzonych przez inne współbieżne transakcje. Poziom izolacji używany dla operacji w ramach operacji ITransaction jest określany przez funkcję IReliableState wykonującą operację.
- Trwałość: Po zakończeniu transakcji jego skutki są trwale wprowadzone w systemie. Modyfikacje są utrwalane nawet w przypadku awarii systemu.
Poziomy izolacji
Poziom izolacji definiuje stopień, w jakim transakcja musi być odizolowana od modyfikacji wprowadzonych przez inne transakcje. Istnieją dwa poziomy izolacji obsługiwane w kolekcjach Reliable Collections:
- Powtarzalny odczyt: określa, że instrukcje nie mogą odczytywać danych, które zostały zmodyfikowane, ale nie zostały jeszcze zatwierdzone przez inne transakcje i że żadne inne transakcje nie mogą modyfikować danych odczytanych przez bieżącą transakcję do momentu zakończenia bieżącej transakcji.
- Migawka: określa, że dane odczytywane przez dowolną instrukcję w transakcji to transakcyjnie spójna wersja danych, które istniały na początku transakcji. Transakcja może rozpoznawać tylko modyfikacje danych, które zostały zatwierdzone przed rozpoczęciem transakcji. Modyfikacje danych wprowadzone przez inne transakcje po rozpoczęciu bieżącej transakcji nie są widoczne dla instrukcji wykonywanych w bieżącej transakcji. Efekt jest taki, jakby instrukcje w transakcji pobierały migawkę zatwierdzonych danych, ponieważ istniały na początku transakcji. Migawki są spójne w różnych kolekcjach reliable.
Kolekcje Niezawodne automatycznie wybierają poziom izolacji do użycia dla danej operacji odczytu w zależności od operacji i roli repliki w momencie utworzenia transakcji. Poniżej znajduje się tabela przedstawiająca wartości domyślne na poziomie izolacji dla operacji Reliable Dictionary i Queue.
Operacja \ Rola | Podstawowe | Pomocniczy |
---|---|---|
Odczyt pojedynczej jednostki | Powtarzalny odczyt | Snapshot |
Wyliczenie, liczba | Snapshot | Snapshot |
Uwaga
Typowymi przykładami operacji pojedynczej jednostki są IReliableDictionary.TryGetValueAsync
: IReliableQueue.TryPeekAsync
.
Zarówno niezawodny słownik, jak i niezawodna kolejka obsługują odczytywanie zapisów. Innymi słowy, każdy zapis w transakcji będzie widoczny dla następującego odczytu, który należy do tej samej transakcji.
Blokady
W usłudze Reliable Collections wszystkie transakcje implementują rygorystyczną blokadę dwufazową: transakcja nie zwalnia nabytych blokad, dopóki transakcja nie zakończy się przerwaniem lub zatwierdzeniem.
Usługa Reliable Dictionary używa blokady na poziomie wiersza dla wszystkich operacji pojedynczej jednostki.
Niezawodna kolejka wymienia współbieżność dla ścisłej transakcyjnej właściwości FIFO.
Niezawodna kolejka używa blokad na poziomie operacji, co pozwala na jedną transakcję z TryPeekAsync
i/lub TryDequeueAsync
i jedną transakcję EnqueueAsync
jednocześnie.
Należy pamiętać, że aby zachować standard FIFO, jeśli element TryPeekAsync
lub TryDequeueAsync
kiedykolwiek zauważy, że kolejka reliable jest pusta, również EnqueueAsync
zablokuje wartość .
Operacje zapisu zawsze przyjmują blokady na wyłączność. W przypadku operacji odczytu blokowanie zależy od kilku czynników:
- Każda operacja odczytu wykonywana przy użyciu izolacji migawki jest bezpłatna.
- Każda powtarzalna operacja odczytu domyślnie przyjmuje blokady udostępnione.
- Jednak w przypadku każdej operacji odczytu obsługującej powtarzalny odczyt użytkownik może poprosić o blokadę aktualizacji zamiast blokady udostępnionej. Blokada aktualizacji to asymetryczna blokada służąca do zapobiegania typowej formie zakleszczenia, która występuje, gdy wiele transakcji blokuje zasoby pod kątem potencjalnych aktualizacji w późniejszym czasie.
Macierz zgodności blokad można znaleźć w poniższej tabeli:
Żądanie \ przyznane | Brak | Udostępniona | Zaktualizuj | Wyłączny |
---|---|---|---|---|
Udostępniona | Brak konfliktu | Brak konfliktu | Konflikt | Konflikt |
Zaktualizuj | Brak konfliktu | Brak konfliktu | Konflikt | Konflikt |
Wyłączny | Brak konfliktu | Konflikt | Konflikt | Konflikt |
Argument limitu czasu w interfejsach API reliable collections jest używany do wykrywania zakleszczenia. Na przykład dwie transakcje (T1 i T2) próbują odczytać i zaktualizować K1. Istnieje możliwość zakleszczenia, ponieważ obaj kończą się blokadą udostępnioną. W takim przypadku upłynął limit czasu jednej lub obu operacji. W tym scenariuszu blokada aktualizacji może uniemożliwić takie zakleszczenie.