Na tej stronie opisujemy spory o dane transakcyjne, serializowalność i izolację. Przykłady kodu transakcji znajdziesz w sekcji Transakcje i zapisywanie zbiorcze.
Transakcje i konflikty danych
Aby transakcja zakończyła się powodzeniem, dokumenty pobrane przez operacje odczytu muszą pozostać niezmienione przez operacje spoza transakcji. Jeśli inna operacja spróbuje zmienić jeden z tych dokumentów, wejdzie w stan konfliktu danych z transakcją.
- Konflikt danych
- Gdy co najmniej 2 operacje konkurują o kontrolę nad tym samym dokumentem. Na przykład jedna transakcja może wymagać, aby dokument pozostał spójny, podczas gdy równoczesna operacja próbuje zaktualizować wartości pól tego dokumentu.
Cloud Firestore rozwiązuje problem z konfliktem danych, opóźniając lub przerywając jedną z operacji. Cloud Firestore Biblioteki klienta automatycznie ponawiają transakcje, które nie powiodły się z powodu konfliktu danych. Po skończonej liczbie ponownych prób operacja transakcji kończy się niepowodzeniem i zwraca komunikat o błędzie:
ABORTED: Too much contention on these documents. Please try again.
Decyzja o tym, które działanie ma się nie powieść lub zostać opóźnione, zależy od typu biblioteki klienta.
Pakiety SDK na urządzenia mobilne i do internetu korzystają z optymistycznej kontroli współbieżności.
Biblioteki klienta serwera używają pesymistycznych mechanizmów kontroli współbieżności.
Konflikt danych w mobilnych i internetowych pakietach SDK
Pakiety SDK na urządzenia mobilne i do internetu (platformy Apple, Android, internet, C++) używają optymistycznej kontroli współbieżności do rozwiązywania problemów z konfliktami danych.
- Optymistyczna kontrola współbieżności
- Na podstawie założenia, że konflikt danych jest mało prawdopodobny lub że blokowanie bazy danych nie jest efektywne. Transakcje optymistyczne nie używają blokad bazy danych, aby uniemożliwiać innym operacjom zmianę danych.
Pakiety SDK na urządzenia mobilne i do internetu korzystają z optymistycznej kontroli współbieżności, ponieważ mogą działać w środowiskach o dużych opóźnieniach i niestabilnym połączeniu sieciowym. Blokowanie dokumentów w środowisku o dużych opóźnieniach powodowałoby zbyt wiele błędów związanych z konkurencją o dane.
W pakietach SDK na urządzenia mobilne i do internetu transakcja śledzi wszystkie dokumenty odczytane w jej ramach. Transakcja kończy operacje zapisu tylko wtedy, gdy żaden z tych dokumentów nie uległ zmianie podczas jej wykonywania. Jeśli jakikolwiek dokument uległ zmianie, moduł obsługi transakcji ponawia próbę przeprowadzenia transakcji. Jeśli po kilku próbach transakcja nie może uzyskać czystego wyniku, kończy się niepowodzeniem z powodu konfliktu danych.
Konflikty danych w bibliotekach klienta serwera
Biblioteki klienta serwera (C#, Go, Java, Node.js, PHP, Python, Ruby) używają pesymistycznych mechanizmów kontroli współbieżności, aby rozwiązywać problemy z konfliktami danych.
- Pesymistyczna kontrola równoczesności
- Zakładamy, że może wystąpić konflikt dostępu do danych. Transakcje pesymistyczne używają blokad bazy danych, aby uniemożliwić innym operacjom modyfikowanie danych.
Biblioteki klienta serwera używają pesymistycznych mechanizmów kontroli współbieżności, ponieważ zakładają małe opóźnienia i niezawodne połączenie z bazą danych.
W bibliotekach klienta serwera transakcje blokują dokumenty, z których odczytują dane. Blokada transakcji w dokumencie uniemożliwia innym transakcjom, zapisanym zbiorczo operacjom zapisu i operacjom zapisu bez transakcji zmianę tego dokumentu. Transakcja zwalnia blokady dokumentu w momencie zatwierdzenia. Zwalnia też blokady, jeśli upłynie limit czasu lub z jakiegokolwiek powodu nie uda się jej wykonać.
Gdy transakcja zablokuje dokument, inne operacje zapisu muszą poczekać, aż transakcja zwolni blokadę. Transakcje uzyskują blokady w kolejności chronologicznej.
Izolacja z możliwością serializacji
Konflikt danych między transakcjami jest ściśle powiązany z poziomami izolacji bazy danych. Poziom izolacji bazy danych określa, jak system radzi sobie z konfliktami między operacjami wykonywanymi jednocześnie. Konflikt wynika z tych wymagań bazy danych:
- Transakcje wymagają dokładnych i spójnych danych.
- Aby efektywnie wykorzystywać zasoby, bazy danych wykonują operacje równolegle.
W systemach o niskim poziomie izolacji operacja odczytu w ramach transakcji może odczytać niedokładne dane z niezatwierdzonych zmian w równoczesnej operacji.
Izolacja serializowalna to najwyższy poziom izolacji. Poziom izolacji Serializable oznacza, że:
- Możesz założyć, że baza danych wykonuje transakcje w seriach.
- Na transakcje nie mają wpływu niezapisane zmiany w równoczesnych operacjach.
Ta gwarancja musi być zachowana nawet wtedy, gdy baza danych wykonuje równolegle wiele transakcji. Baza danych musi implementować mechanizmy kontroli współbieżności, aby rozwiązywać konflikty, które mogłyby naruszyć tę gwarancję.
Cloud Firestore gwarantuje serializowalną izolację transakcji. Transakcje w Cloud Firestore są serializowane i izolowane według czasu zatwierdzenia.
Izolacja serializowalna według czasu zatwierdzenia
Cloud Firestore przypisuje każdej transakcji czas zatwierdzenia, który reprezentuje pojedynczy moment w czasie. Gdy Cloud Firestore zatwierdza zmiany transakcji w bazie danych, możesz założyć, że wszystkie odczyty i zapisy w ramach transakcji odbywają się dokładnie w momencie zatwierdzenia.
Rzeczywiste wykonanie transakcji wymaga pewnego czasu. Wykonanie transakcji rozpoczyna się przed czasem zatwierdzenia, a wykonanie wielu operacji może się nakładać. Cloud Firestore zachowuje izolację z możliwością serializacji i gwarantuje, że:
- Cloud Firestore zatwierdza transakcje w kolejności zgodnej z czasem zatwierdzenia.
- Cloud Firestore izoluje transakcje od równoczesnych operacji z późniejszym czasem zatwierdzenia.
W przypadku konfliktu danych między operacjami wykonywanymi jednocześnie usługa Cloud Firestore używa optymistycznej i pesymistycznej kontroli współbieżności, aby rozwiązać konflikt.
Izolacja w ramach transakcji
Izolacja transakcji dotyczy też operacji zapisu w ramach transakcji. Zapytania i odczyty w transakcji nie widzą wyników poprzednich zapisów w tej transakcji. Nawet jeśli zmodyfikujesz lub usuniesz dokument w ramach transakcji, wszystkie odczyty dokumentu w tej transakcji zwrócą wersję dokumentu w momencie zatwierdzenia, czyli przed operacjami zapisu w transakcji. Operacje odczytu nie zwracają niczego, jeśli dokument nie istniał w danym momencie.
Problemy z konkurencją o dane
Więcej informacji o konfliktach danych i sposobach ich rozwiązywania znajdziesz na stronie dotyczącej rozwiązywania problemów.