Transakcje i optymistyczna kontrola współbieżności
DOTYCZY: NoSQL
Transakcje bazy danych zapewniają bezpieczny i przewidywalny model programowania do obsługi współbieżnych zmian danych. Tradycyjne relacyjne bazy danych, takie jak SQL Server, umożliwiają pisanie logiki biznesowej przy użyciu procedur składowanych i/lub wyzwalaczy, wysyłają je do serwera do wykonywania bezpośrednio w aucie bazy danych. W przypadku tradycyjnych relacyjnych baz danych należy radzić sobie z dwoma różnymi językami programowania aplikacji (bez transakcji), takimi jak JavaScript, Python, C#, Java itp. oraz transakcyjny język programowania (np. T-SQL), który jest natywnie wykonywany przez bazę danych.
Aparat bazy danych w usłudze Azure Cosmos DB obsługuje pełne transakcje zgodne z funkcją ACID (niepodzielność, spójność, izolacja, trwałość) z izolacją migawki. Wszystkie operacje bazy danych w zakresie partycji logicznej kontenera są wykonywane transakcyjnie w aplice bazy danych hostowanej przez replikę partycji. Te operacje obejmują zarówno operacje zapisu (aktualizowanie co najmniej jednego elementu w partycji logicznej) i operacje odczytu. W poniższej tabeli przedstawiono różne operacje i typy transakcji:
Operacja | Typ operacji | Transakcja pojedynczego lub wielu elementów |
---|---|---|
Wstawianie (bez wyzwalacza przed/po) | Write | Transakcja pojedynczego elementu |
Wstaw (z wyzwalaczem wstępnym/po) | Zapis i odczyt | Transakcja z wieloma elementami |
Zamień (bez wyzwalacza przed/po) | Write | Transakcja pojedynczego elementu |
Zamień (na wyzwalacz wstępny/post) | Zapis i odczyt | Transakcja z wieloma elementami |
Upsert (bez wyzwalacza przed/po) | Write | Transakcja pojedynczego elementu |
Upsert (z wyzwalaczem wstępnym/po) | Zapis i odczyt | Transakcja z wieloma elementami |
Usuwanie (bez wyzwalacza przed/po) | Write | Transakcja pojedynczego elementu |
Usuwanie (z wyzwalaczem wstępnym/po) | Zapis i odczyt | Transakcja z wieloma elementami |
Wykonaj procedurę składowaną | Zapis i odczyt | Transakcja z wieloma elementami |
Zainicjowane przez system wykonanie procedury scalania | Write | Transakcja z wieloma elementami |
Zainicjowane przez system wykonywanie usuwania elementów na podstawie wygaśnięcia (TTL) elementu | Write | Transakcja z wieloma elementami |
Przeczytaj | Przeczytaj | Transakcja pojedynczego elementu |
Zestawienie zmian | Przeczytaj | Transakcja z wieloma elementami |
Odczyt podzielony na strony | Przeczytaj | Transakcja z wieloma elementami |
Zapytanie podzielone na strony | Przeczytaj | Transakcja z wieloma elementami |
Wykonywanie funkcji zdefiniowanej przez użytkownika w ramach zapytania podzielonego na strony | Przeczytaj | Transakcja z wieloma elementami |
Transakcje obejmujące wiele elementów
Usługa Azure Cosmos DB umożliwia pisanie procedur składowanych, wyzwalaczy wstępnych/post, funkcji zdefiniowanych przez użytkownika i procedur scalania w języku JavaScript. Usługa Azure Cosmos DB natywnie obsługuje wykonywanie języka JavaScript wewnątrz aparatu bazy danych. Procedury składowane, wyzwalacze wstępne/post, funkcje zdefiniowane przez użytkownika (UDF) i procedury scalania można zarejestrować w kontenerze, a później wykonywać je transakcyjnie w akompaniacie bazy danych usługi Azure Cosmos DB. Pisanie logiki aplikacji w języku JavaScript umożliwia naturalne wyrażenie przepływu sterowania, określanie zakresu zmiennych, przypisywanie i integrowanie elementów pierwotnych obsługi wyjątków w ramach transakcji bazy danych bezpośrednio w języku JavaScript.
Procedury składowane, wyzwalacze, funkcje zdefiniowane przez użytkownika i procedury scalania oparte na języku JavaScript są opakowane w otoczenia transakcji ACID z izolacją migawki we wszystkich elementach w partycji logicznej. W trakcie wykonywania, jeśli program JavaScript zgłasza wyjątek, cała transakcja zostanie przerwana i wycofana. Wynikowy model programowania jest prosty, ale zaawansowany. Deweloperzy języka JavaScript uzyskują trwały model programowania, a jednocześnie używają znanych konstrukcji językowych i elementów pierwotnych biblioteki.
Możliwość wykonywania kodu JavaScript bezpośrednio w a aparatze bazy danych zapewnia wydajność i transakcyjne wykonywanie operacji bazy danych względem elementów kontenera. Ponadto, ponieważ aparat bazy danych usługi Azure Cosmos DB natywnie obsługuje pliki JSON i JavaScript, nie ma niezgodności impedancji między systemami typów aplikacji a bazą danych.
Optymistyczna kontrola współbieżności
Optymistyczna kontrola współbieżności umożliwia zapobieganie utracie aktualizacji i usuwania. Współbieżne operacje powodujące konflikt podlegają regularnemu pesymistycznemu zablokowaniu aparatu bazy danych hostowanego przez partycję logiczną będącą właścicielem elementu. Gdy dwie współbieżne operacje próbują zaktualizować najnowszą wersję elementu w partycji logicznej, jedna z nich wygra, a druga zakończy się niepowodzeniem. Jeśli jednak jedna lub dwie operacje próbujące współbieżnie zaktualizować ten sam element wcześniej odczytał starszą wartość elementu, baza danych nie wie, czy wcześniej odczytywana wartość przez operacje powodujące konflikt był rzeczywiście najnowszą wartością elementu. Na szczęście tę sytuację można wykryć za pomocą optymistycznej kontroli współbieżności (OCC) przed zezwoleniem dwóm operacjom na wejście granicy transakcji wewnątrz aparatu bazy danych. OCC chroni dane przed przypadkowym zastąpieniem zmian wprowadzonych przez inne osoby. Zapobiega to również przypadkowemu zastępowaniu własnych zmian przez inne osoby.
Implementowanie optymistycznej kontrolki współbieżności przy użyciu nagłówków ETag i HTTP
Każdy element przechowywany w kontenerze usługi Azure Cosmos DB ma zdefiniowaną _etag
właściwość systemową. Wartość elementu _etag
jest generowana automatycznie i aktualizowana przez serwer za każdym razem, gdy element jest aktualizowany. _etag
Można użyć z dostarczonym if-match
przez klienta nagłówkiem żądania, aby umożliwić serwerowi podjęcie decyzji, czy element może zostać warunkowo zaktualizowany. Wartość nagłówka if-match
jest zgodna z _etag
wartością na serwerze, element jest następnie aktualizowany. Jeśli wartość nagłówka if-match
żądania nie jest już aktualna, serwer odrzuca operację z komunikatem odpowiedzi "Błąd warunku wstępnego HTTP 412". Następnie klient może ponownie pobrać element, aby uzyskać bieżącą wersję elementu na serwerze lub zastąpić wersję elementu na serwerze własną _etag
wartością elementu. Ponadto można użyć z nagłówkiemif-none-match
, aby określić, _etag
czy jest potrzebne ponowne pobranie zasobu.
Wartość elementu _etag
zmienia się za każdym razem, gdy element jest aktualizowany. W przypadku operacji if-match
zastępowania elementów należy jawnie wyrazić jako część opcji żądania. Przykładowy kod można znaleźć w witrynie GitHub. _etag
wartości są niejawnie sprawdzane dla wszystkich zapisanych elementów dotkniętych procedurą składowaną. Jeśli wystąpi jakikolwiek konflikt, procedura składowana wycofa transakcję i zgłosi wyjątek. W przypadku tej metody wszystkie lub żadne zapisy w procedurze składowanej są stosowane niepodziealnie. Jest to sygnał dla aplikacji, aby ponownie zastosować aktualizacje i ponowić próbę oryginalnego żądania klienta.
Optymistyczna kontrola współbieżności i dystrybucja globalna
Współbieżne aktualizacje elementu są poddawane OCC przez warstwę protokołu komunikacyjnego usługi Azure Cosmos DB. W przypadku kont usługi Azure Cosmos DB skonfigurowanych na potrzeby zapisu w jednym regionie usługa Azure Cosmos DB zapewnia, że wersja elementu aktualizowanego (lub usuwania) po stronie klienta jest taka sama jak wersja elementu w kontenerze usługi Azure Cosmos DB. Dzięki temu zapisy są chronione przed przypadkowym zastąpieniem przez zapisy innych i odwrotnie. W środowisku z wieloma użytkownikami optymistyczna kontrola współbieżności chroni przed przypadkowym usunięciem lub zaktualizowaniem nieprawidłowej wersji elementu. W związku z tym elementy są chronione przed niesławnymi problemami "utraconych aktualizacji" lub "utraconym usunięciem".
Na koncie usługi Azure Cosmos DB skonfigurowanym z zapisami w wielu regionach dane mogą być zatwierdzane niezależnie w regionach pomocniczych, jeśli _etag
są zgodne z danymi w regionie lokalnym. Po zatwierdzeniu nowych danych lokalnie w regionie pomocniczym jest on następnie scalony w regionie centrum lub regionie podstawowym. Jeśli zasady rozwiązywania konfliktów scalą nowe dane z regionem centrum, te dane zostaną zreplikowane globalnie przy użyciu nowego _etag
elementu . Jeśli zasady rozwiązywania konfliktów odrzucają nowe dane, region pomocniczy zostanie wycofany do oryginalnych danych i _etag
.
Następne kroki
Dowiedz się więcej na temat transakcji bazy danych i optymistycznej kontroli współbieżności w następujących artykułach: