serializowalność i izolacja transakcji;

Na tej stronie opisaliśmy rywalizowanie o transakcyjne dane, serializowalność izolacji użytkowników. Przykładowe kody transakcji znajdziesz tutaj: transakcje i zapisy zbiorcze.

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 rywalizację o dane, opóźniając lub w przypadku błędu jednego z tych działań. Biblioteki klienta Cloud Firestore automatycznie ponawiać transakcji, które nie powiodły się z powodu rywalizacji o dane. 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 o tym, które działanie zakończy się niepowodzeniem, a które opóźnione, 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.

Ustawienia optymalnej 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 do reklam mobilnych i internetowych wykorzystują optymistyczne ustawienia równoczesności, ponieważ mogą o dużych opóźnieniach i niestabilnym połączeniu sieciowym. 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 tak, dokument zmienił się, moduł obsługi transakcji ponawia próbę zrealizowania transakcji. 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 nakładają blokady na dokumenty, które przeczytaj. 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. Konflikty pochodzą z następujące wymagania dotyczące bazy danych:

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

W systemach z niskim poziomem izolacji operacja odczytu w ramach transakcji może odczytywać niedokładne dane z niezatwierdzonych zmian jednocześnie .

Serializowalna izolacja 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, rozwiązywać konflikty, które mogłyby złamać tę gwarancję.

Cloud Firestore gwarantuje serializowalną izolację transakcji. Transakcje w Cloud Firestore są serializowane i odizolowane przez zatwierdzenie obecnie się znajdujesz.

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 zatwierdzi transakcję 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.
  • Cloud Firestore izoluje transakcje od jednoczesnych z późniejszym czasem zatwierdzenia.

W przypadku rywalizacji o dane między operacjami równoczesnymi Cloud Firestore używa optymistycznych i pesymistycznych ustawień równoczesności do rozwiązywania rywalizacji.

Izolacja w ramach transakcji

Izolacja transakcji ma również 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 na temat rywalizacji o dane i sposobów jej rozwiązywania znajdziesz na stronie rozwiązywania problemów.