Transakcje i optymistyczna kontrola współbieżnościTransactions and optimistic concurrency control

Transakcje bazy danych zapewniają bezpieczny i przewidywalny model programowania do obsługi równoczesnych zmian w danych.Database transactions provide a safe and predictable programming model to deal with concurrent changes to the data. Tradycyjne relacyjne bazy danych, takie jak SQL Server, umożliwiają pisanie logiki biznesowej za pomocą procedur składowanych i/lub wyzwalaczy, wysyłać je do serwera w celu wykonania bezpośrednio w aparacie bazy danych.Traditional relational databases, like SQL Server, allow you to write the business logic using stored-procedures and/or triggers, send it to the server for execution directly within the database engine. W przypadku tradycyjnych relacyjnych baz danych wymagane jest zaradzenie sobie z dwoma różnymi językami programowania (nietransakcyjnymi) językami programowania aplikacji, takimi jak JavaScript, Python, C#Java itp. i transakcyjnym językiem programowania ( takie jak T-SQL), które są natywnie wykonywane przez bazę danych.With traditional relational databases, you are required to deal with two different programming languages the (non-transactional) application programming language such as JavaScript, Python, C#, Java, etc. and the transactional programming language (such as T-SQL) that is natively executed by the database.

Aparat bazy danych w Azure Cosmos DB obsługuje transakcję zgodności z pełnym KWASem (niepodzielność, spójność, izolacja, trwałość) z izolacją migawki.The database engine in Azure Cosmos DB supports full ACID (Atomicity, Consistency, Isolation, Durability) compliant transactions with snapshot isolation. Wszystkie operacje bazy danych w zakresie partycji logicznej kontenera są transakcjami wykonywane w aparacie bazy danych hostowanym przez replikę partycji.All the database operations within the scope of a container's logical partition are transactionally executed within the database engine that is hosted by the replica of the partition. Te operacje obejmują zarówno zapis (Aktualizacja co najmniej jednego elementu w ramach partycji logicznej), jak i operacje odczytu.These operations include both write (updating one or more items within the logical partition) and read operations. W poniższej tabeli przedstawiono różne operacje i typy transakcji:The following table illustrates different operations and transaction types:

OperacjaOperation Typ operacjiOperation Type Pojedyncza lub wieloelementowa transakcjaSingle or Multi Item Transaction
Insert (bez wyzwalacza wstępnego/końcowego)Insert (without a pre/post trigger) ZapisWrite Transakcja pojedynczego elementuSingle item transaction
Insert (z wyzwalaczem poprzedzającym/post)Insert (with a pre/post trigger) Zapisz i przeczytajWrite and Read Transakcja WieloelementowaMulti-item transaction
Replace (bez wyzwalacza wstępnego/końcowego)Replace (without a pre/post trigger) ZapisWrite Transakcja pojedynczego elementuSingle item transaction
Replace (z wyzwalaczem poprzedzającym/post)Replace (with a pre/post trigger) Zapisz i przeczytajWrite and Read Transakcja WieloelementowaMulti-item transaction
Upsert (bez wyzwalacza wstępnego/końcowego)Upsert (without a pre/post trigger) ZapisWrite Transakcja pojedynczego elementuSingle item transaction
Upsert (z wyzwalaczem poprzedzającym/post)Upsert (with a pre/post trigger) Zapisz i przeczytajWrite and Read Transakcja WieloelementowaMulti-item transaction
Usuń (bez wyzwalacza wstępnego/końcowego)Delete (without a pre/post trigger) ZapisWrite Transakcja pojedynczego elementuSingle item transaction
Usuń (z wyzwalaczem pre/post)Delete (with a pre/post trigger) Zapisz i przeczytajWrite and Read Transakcja WieloelementowaMulti-item transaction
Wykonaj procedurę składowanąExecute stored procedure Zapisz i przeczytajWrite and Read Transakcja WieloelementowaMulti-item transaction
System zainicjował wykonywanie procedury scalaniaSystem initiated execution of a merge procedure ZapisWrite Transakcja WieloelementowaMulti-item transaction
System zainicjował wykonywanie usuwania elementów na podstawie wygaśnięcia (TTL) elementuSystem initiated execution of deleting items based on expiration (TTL) of an item ZapisWrite Transakcja WieloelementowaMulti-item transaction
OdczytRead OdczytRead Transakcja pojedynczego elementuSingle-item transaction
Zestawienie zmianChange Feed OdczytRead Transakcja WieloelementowaMulti-item transaction
Odczyt podzielony na stronyPaginated Read OdczytRead Transakcja WieloelementowaMulti-item transaction
Zapytanie z podziałem na stronyPaginated Query OdczytRead Transakcja WieloelementowaMulti-item transaction
Wykonaj funkcję UDF w ramach zapytania z podziałem na stronyExecute UDF as part of the paginated query OdczytRead Transakcja WieloelementowaMulti-item transaction

Transakcje wieloelementoweMulti-item transactions

Azure Cosmos DB pozwala pisać procedury składowane, wyzwalacze pre/post, funkcje zdefiniowane przez użytkownika (UDF) i procedury scalania w języku JavaScript.Azure Cosmos DB allows you to write stored procedures, pre/post triggers, user-defined-functions (UDFs) and merge procedures in JavaScript. Azure Cosmos DB natywnie obsługuje wykonywanie kodu JavaScript wewnątrz aparatu bazy danych.Azure Cosmos DB natively supports JavaScript execution inside its database engine. Można rejestrować procedury składowane, wyzwalacze pre/post, funkcje zdefiniowane przez użytkownika (UDF) oraz procedury scalania w kontenerze, a następnie wykonywać je w sposób niefunkcjonalny w aparacie bazy danych Cosmos Azure.You can register stored procedures, pre/post triggers, user-defined-functions (UDFs) and merge procedures on a container and later execute them transactionally within the Azure Cosmos database engine. Pisanie logiki aplikacji w języku JavaScript umożliwia naturalne wyrażenie przepływu sterowania, zmiennej określania zakresu, przydziału i integracji wyjątków dla elementów podstawowych w ramach transakcji bazy danych bezpośrednio w języku JavaScript.Writing application logic in JavaScript allows natural expression of control flow, variable scoping, assignment, and integration of exception handling primitives within the database transactions directly in the JavaScript language.

Procedury składowane bazujące na języku JavaScript, wyzwalacze, UDF i procedury scalania są opakowane w obrębie transakcji otaczającej kwas z izolacją migawki dla wszystkich elementów w obrębie partycji logicznej.The JavaScript-based stored procedures, triggers, UDFs, and merge procedures are wrapped within an ambient ACID transaction with snapshot isolation across all items within the logical partition. W trakcie wykonywania, jeśli program JavaScript zgłosi wyjątek, cała transakcja zostanie przerwana i wycofana.During the course of its execution, if the JavaScript program throws an exception, the entire transaction is aborted and rolled-back. Model programowania wynikający z tego nie jest jeszcze zaawansowany.The resulting programming model is simple yet powerful. Deweloperzy języka JavaScript uzyskują trwały model programowania przy użyciu znanych konstrukcji językowych i elementów podstawowych biblioteki.JavaScript developers get a durable programming model while still using their familiar language constructs and library primitives.

Możliwość wykonywania kodu JavaScript bezpośrednio w aparacie bazy danych zapewnia wydajność i transakcyjne wykonywanie operacji bazy danych na elementach kontenera.The ability to execute JavaScript directly within the database engine provides performance and transactional execution of database operations against the items of a container. Ponadto, ponieważ aparat bazy danych Azure Cosmos Database natywnie obsługuje kod JSON i kod JavaScript, nie występuje niezgodność między systemami typów aplikacji a bazą danych.Furthermore, since Azure Cosmos database engine natively supports JSON and JavaScript, there is no impedance mismatch between the type systems of an application and the database.

Optymistyczna kontrola współbieżnościOptimistic concurrency control

Optymistyczna kontrola współbieżności umożliwia Zapobieganie utracie aktualizacji i usunięć.Optimistic concurrency control allows you to prevent lost updates and deletes. Współbieżne operacje powodujące konflikt są uzależnione od zwykłego blokowania pesymistycznego aparatu bazy danych hostowanego przez partycję logiczną będącą właścicielem elementu.Concurrent, conflicting operations are subjected to the regular pessimistic locking of the database engine hosted by the logical partition that owns the item. Gdy dwie operacje współbieżne będą próbowały zaktualizować najnowszą wersję elementu w ramach partycji logicznej, jeden z nich zostanie wygrany, a drugie zakończy się niepowodzeniem.When two concurrent operations attempt to update the latest version of an item within a logical partition, one of them will win and the other will fail. Jeśli jednak jedna lub dwie operacje próbujące zaktualizować ten sam element wcześniej odczytały starszą wartość elementu, baza danych nie wie, czy poprzednio odczytana wartość przez jedną lub obie operacje powodujące konflikt były rzeczywiście ostatnią wartością elementu.However, if one or two operations attempting to concurrently update the same item had previously read an older value of the item, the database doesn’t know if the previously read value by either or both the conflicting operations was indeed the latest value of the item. Na szczęście tę sytuację można wykryć przy użyciu optymistycznej kontroli współbieżności (OCC) przed umożliwieniem, aby dwie operacje mogły wprowadzić granicę transakcji wewnątrz aparatu bazy danych.Fortunately, this situation can be detected with the Optimistic Concurrency Control (OCC) before letting the two operations enter the transaction boundary inside the database engine. OCC chroni dane przed przypadkowym zastąpieniem zmian wprowadzonych przez inne osoby.OCC protects your data from accidentally overwriting changes that were made by others. Uniemożliwia to innym osobom przypadkowe zastąpienie własnych zmian.It also prevents others from accidentally overwriting your own changes.

Współbieżne aktualizacje elementu są uzależnione od warstwy protokołu komunikacyjnego OCC przez Azure Cosmos DB.The concurrent updates of an item are subjected to the OCC by Azure Cosmos DB’s communication protocol layer. Usługa Azure Cosmos Database gwarantuje, że wersja elementu po stronie klienta aktualizowana (lub usuwana) jest taka sama jak wersja elementu w kontenerze usługi Azure Cosmos.Azure Cosmos database ensures that the client-side version of the item that you are updating (or deleting) is the same as the version of the item in the Azure Cosmos container. Gwarantuje to, że zapisy są chronione przed przypadkowym zastąpieniem przez zapisy innych i na odwrót.This guarantees that your writes are protected from being overwritten accidentally by the writes of others and vice versa. W środowisku z obsługą kilku użytkowników optymistyczna kontrola współbieżności chroni przed przypadkowym usunięciem lub aktualizacją nieprawidłowej wersji elementu.In a multi-user environment, the optimistic concurrency control protects you from accidentally deleting or updating wrong version of an item. W związku z tym elementy są chronione przed problemami z inFAMOUS "utraconej aktualizacji" lub "utracone usuwanie".As such, items are protected against the infamous “lost update” or “lost delete” problems.

Każdy element przechowywany w kontenerze usługi Azure Cosmos ma właściwość zdefiniowaną przez _etag system.Every item stored in an Azure Cosmos container has a system defined _etag property. Wartość _etag jest automatycznie generowana i aktualizowana przez serwer za każdym razem, gdy element zostanie zaktualizowany.The value of the _etag is automatically generated and updated by the server every time the item is updated. _etagmoże być używany z nagłówkiem żądania if-match dostarczonego przez klienta, aby umożliwić serwerowi podjęcie decyzji o tym, czy element może być aktualizowany warunkowo._etag can be used with the client supplied if-match request header to allow the server to decide whether an item can be conditionally updated. Wartość if-match nagłówka jest zgodna z wartością _etag na serwerze, a następnie jest aktualizowana.The value of the if-match header matches the value of the _etag at the server, the item is then updated. Jeśli wartość if-match nagłówka żądania nie jest już aktualna, serwer odrzuca operację z komunikatem odpowiedzi "Niepowodzenie warunku wstępnego http 412".If the value of the if-match request header is no longer current, the server rejects the operation with an "HTTP 412 Precondition failure" response message. 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ą dla tego elementu.The client then can re-fetch the item to acquire the current version of the item on the server or override the version of item in the server with its own _etag value for the item. Ponadto, można _etag użyć if-none-match z nagłówkiem, aby określić, czy konieczne jest ponowne pobranie zasobu.In addition, _etag can be used with the if-none-match header to determine whether a refetch of a resource is needed.

_etag Wartość elementu jest zmieniana za każdym razem, gdy element zostanie zaktualizowany.The item’s _etag value changes every time the item is updated. W przypadku operacji if-match Zamień element musi być jawnie wyrażona jako część opcji żądania.For replace item operations, if-match must be explicitly expressed as a part of the request options. Aby zapoznać się z przykładem, zobacz przykładowy kod w usłudze GitHub.For an example, see the sample code in GitHub. _etagwartości są niejawnie sprawdzane dla wszystkich elementów zapisanych przez procedurę składowaną._etag values are implicitly checked for all written items touched by the stored procedure. W przypadku wykrycia dowolnego konfliktu procedura składowana wycofa transakcję i zgłosi wyjątek.If any conflict is detected, the stored procedure will roll back the transaction and throw an exception. W przypadku tej metody wszystkie lub żadne zapisy w procedurze składowanej są stosowane niepodzielnie.With this method, either all or no writes within the stored procedure are applied atomically. Jest to sygnał do aplikacji w celu ponownego zastosowania aktualizacji i ponowienia próby oryginalnego żądania klienta.This is a signal to the application to reapply updates and retry the original client request.

Następne krokiNext steps

Dowiedz się więcej o transakcjach bazy danych i optymistycznej kontroli współbieżności w następujących artykułach:Learn more about database transactions and optimistic concurrency control in the following articles: