serializowalność i izolacja transakcji;

Ta strona opisuje rywalizację o dane transakcyjne, serializację i izolację. Przykłady kodu transakcji znajdziesz w artykule Transakcje i zbiorowe zapisy.

Transakcje i rywalizacja o dane

Aby transakcja została zrealizowana, dokumenty pobrane w ramach jej operacji odczytu musi pozostać niezmodyfikowane przez operacje poza transakcją. Jeśli inny podejmowana jest próba zmiany jednego z tych dokumentów, stan rywalizacji o dane z transakcją.

Rywalizacja o dane
Gdy co najmniej 2 operacje konkurują o kontrolę tego samego dokumentu. Przykład: jedna transakcja może wymagać zachowania spójności dokumentu próbuje zaktualizować wartości pól tego dokumentu.

Cloud Firestore rozwiązuje konflikty dotyczące danych, opóźniając lub eliminując błąd jednego z tych działań. Biblioteki klienta Cloud Firestore automatycznie powtarzają transakcje, które nie powiodły się z powodu konfliktu danych. Po nieskończona liczba ponownych prób, operacja transakcji kończy się niepowodzeniem i zwróceniem błędu wiadomość:

ABORTED: Too much contention on these documents. Please try again.

Przy podejmowaniu decyzji, którą operację zakończy się niepowodzeniem, a które opóźnienie, zależy od rodzaju z biblioteką klienta.

  • Pakiety SDK na urządzenia mobilne i internetowe korzystają z optymistycznej równoczesności elementów sterujących.

  • Biblioteki klienta serwera używają pesymistycznych ustawień równoczesności.

Rywalizacja o dane w mobilnych i internetowych pakietach SDK

Pakiety SDK na urządzenia mobilne i internetowe (platformy Apple, Android, internet, C++) wykorzystują optymistyczne ustawienia równoczesności, i rozwiązywać konflikty o dane.

Optymistyczne mechanizmy kontroli równoczesności
Opierając się na założeniu, że rywalizacja o dane jest mało prawdopodobna lub nie pozwalają skutecznie blokować blokady baz danych. W przypadku optymistycznych transakcji nie jest używana baza danych blokady, aby blokować inne operacje zmiany danych.

Pakiety SDK na urządzenia mobilne i internet używają optymalnych mechanizmów kontroli współbieżności, ponieważ mogą działać w środowiskach o wysokim opóźnieniu i niepewnym połączeniu z internetem. Blokuję dokumenty w środowisku o dużym czasie oczekiwania spowodowałyby zbyt dużą rywalizację o dane błędów.

W przypadku pakietów SDK do urządzeń mobilnych/internetowych transakcja śledzi wszystkie czytane dokumenty w transakcji. Transakcja wykonuje tylko operacje zapisu jeśli żaden z tych dokumentów nie został zmieniony podczas wykonywania transakcji. Jeśli jakikolwiek dokument uległ zmianie, moduł obsługi transakcji powtarza transakcję. Jeśli transakcja nie może uzyskać miarodajnych wyników po kilku próbach, nie uda się z powodu rywalizacji o dane.

Rywalizacja o dane w bibliotekach klienta serwera

Używane są biblioteki klienta serwera (C#, Go, Java, Node.js, PHP, Python, Ruby) pesymistyczne mechanizmy kontroli równoczesności rozwiązują konflikt danych.

Pesymistyczne ustawienia równoczesności
Na podstawie założenia, że rywalizacja o dane jest prawdopodobna. Pesymizm transakcje używają blokad bazy danych, aby uniemożliwić innym operacjam modyfikowanie danych.

Biblioteki klienta serwera używają pesymistycznych mechanizmów kontroli równoczesności, ponieważ zakładają krótki czas oczekiwania i stabilne połączenie z bazą danych.

W bibliotekach klienta serwera transakcje blokują dokumenty, które są odczytywane. blokada transakcji na dokumencie blokuje inne transakcje, zapisy wsadowe i zapisy nietransakcyjne wynikające ze zmiany dokumentu. O transakcja zwalnia blokady dokumentów w czasie zatwierdzenia. Dodatkowo zwalnia blokady, jeśli z jakiegoś powodu zostanie przekroczony limit czasu lub ulegnie awarii.

Gdy transakcja blokuje dokument, inne operacje zapisu muszą poczekać na transakcji, aby odblokować. Transakcje zostają zabezpieczone w porządku chronologicznym.

Izolacja szeregowa

Rywalizacja między transakcjami jest ściśle związana z izolacją baz danych poziomów. Poziom izolacji bazy danych określa, jak dobrze system obsługuje konflikty między operacjami równoczesnymi. Konflikt wynika z tych wymagań dotyczących bazy danych:

  • Transakcje wymagają dokładnych i spójnych danych.
  • Aby wydajnie wykorzystywać zasoby, bazy danych wykonują operacje jednocześnie.

W systemach o niskim poziomie izolacji operacja odczytu w ramach transakcji może odczytać nieprawidłowe dane z niezaakceptowanych zmian w równoległej operacji.

Izolacja serializacji określa najwyższy poziom izolacji. Możliwe do szeregowania oznacza, że:

  • Możesz przyjąć, że baza danych wykonuje transakcje w serii.
  • Niezatwierdzone zmiany w operacjach równoczesnych nie mają wpływu na transakcje.

Ta gwarancja musi działać nawet wtedy, gdy baza danych wykonuje wiele transakcji równolegle. Baza danych musi wdrożyć ustawienia równoczesności, aby rozwiązywać konflikty, które mogłyby złamać tę gwarancję.

Cloud Firestore gwarantuje serializowalne izolowanie transakcji. Transakcje w Cloud Firestore są serializowane i izolowane w momencie zatwierdzania.

Serializowalna izolacja według czasu zatwierdzenia

Cloud Firestore przypisuje każdej transakcji czas zatwierdzenia, który reprezentuje w jednym miejscu w czasie. Gdy Cloud Firestore zatwierdza transakcji zmian w bazie danych, możesz przyjąć wszystkie odczyty i zapisy w transakcja ma miejsce dokładnie w momencie zatwierdzenia.

Faktyczne wykonanie transakcji wymaga nieco czasu. Wykonanie transakcja rozpoczyna się przed czasem zatwierdzenia, a wykonanie kilku operacje mogą się nakładać. Cloud Firestore podtrzymuje serializowalną izolację i gwarantuje, że:

  • Cloud Firestore zatwierdza transakcje w kolejności według czasu zatwierdzenia.
  • Funkcja Cloud Firestore oddziela transakcje od równoczesnych z późniejszym czasem zatwierdzenia.

W przypadku rywalizacji o dane między równoległymi operacjami Cloud Firestore używa optymizmu i pesymizmu w celu rozwiązania rywalizacji.

Izolacja w ramach transakcji

Izolacja transakcji ma też zastosowanie do operacji zapisu w ramach transakcji. Zapytania i odczyty w ramach transakcji nie widzą wyników poprzednich zapisów w ramach tej transakcji. Nawet jeśli zmodyfikujesz lub usuniesz dokument w wszystkie odczyty dokumentów w tej transakcji zwracają wersję funkcji dokumentu w czasie zatwierdzenia, przed operacjami zapisu transakcji. Operacje odczytu nie zwracają niczego, jeśli dokument nie istniał w danym momencie.

Problemy z rywalizacją o dane

Więcej informacji o konflikcie danych i sposobach jego rozwiązania znajdziesz na stronie z poradami dotyczącymi rozwiązywania problemów.