İşlemler ve iyimser eşzamanlılık denetimiTransactions and optimistic concurrency control

Veritabanı işlemleri, verilerdeki eşzamanlı değişikliklerle başa çıkmak için güvenli ve öngörülebilir bir programlama modeli sağlar.Database transactions provide a safe and predictable programming model to deal with concurrent changes to the data. SQL Server gibi geleneksel ilişkisel veritabanları, depolanan yordamları ve/veya Tetikleyicileri kullanarak iş mantığını yazmanızı sağlar, bu dosyayı doğrudan veritabanı altyapısının içinde yürütülmek üzere sunucuya gönderir.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. Geleneksel ilişkisel veritabanlarında, JavaScript, Python, C#, Java, vb. gibi (işlemsel olmayan) uygulama programlama dili ve veritabanı tarafından yerel olarak yürütülen işlem programlama dili (T-SQL) gibi iki farklı programlama dili ile uğraşmanız gerekir.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.

Azure Cosmos DB veritabanı altyapısı, anlık görüntü yalıtımıyla tam ACID (Atomicity, tutarlılık, yalıtım, dayanıklılık) uyumlu işlemleri destekler.The database engine in Azure Cosmos DB supports full ACID (Atomicity, Consistency, Isolation, Durability) compliant transactions with snapshot isolation. Bir kapsayıcının mantıksal bölümünün kapsamındaki tüm veritabanı işlemleri, Bölüm çoğaltması tarafından barındırılan veritabanı altyapısında işlem içinde yürütülür.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. Bu işlemler hem yazma (mantıksal bölümün içindeki bir veya daha fazla öğeyi güncelleştirme) hem de okuma işlemlerini içerir.These operations include both write (updating one or more items within the logical partition) and read operations. Aşağıdaki tabloda farklı işlemler ve işlem türleri gösterilmektedir:The following table illustrates different operations and transaction types:

İşlemOperation İşlem türüOperation Type Tek veya çoklu öğe IşlemiSingle or Multi Item Transaction
Ekle (ön/son tetikleyici olmadan)Insert (without a pre/post trigger) YazmaWrite Tek öğe işlemiSingle item transaction
Insert (bir ön/son tetikleyici ile)Insert (with a pre/post trigger) Yazma ve okumaWrite and Read Çoklu öğe işlemiMulti-item transaction
Değiştir (ön/son tetikleyici olmadan)Replace (without a pre/post trigger) YazmaWrite Tek öğe işlemiSingle item transaction
Değiştir (bir ön/son tetikleyici ile)Replace (with a pre/post trigger) Yazma ve okumaWrite and Read Çoklu öğe işlemiMulti-item transaction
Upsert (ön/son tetikleyici olmadan)Upsert (without a pre/post trigger) YazmaWrite Tek öğe işlemiSingle item transaction
Upsert (bir ön/son tetikleyici ile)Upsert (with a pre/post trigger) Yazma ve okumaWrite and Read Çoklu öğe işlemiMulti-item transaction
Sil (ön/son tetikleyici olmadan)Delete (without a pre/post trigger) YazmaWrite Tek öğe işlemiSingle item transaction
Sil (bir ön/son tetikleyici ile)Delete (with a pre/post trigger) Yazma ve okumaWrite and Read Çoklu öğe işlemiMulti-item transaction
Saklı yordamı YürütExecute stored procedure Yazma ve okumaWrite and Read Çoklu öğe işlemiMulti-item transaction
Sistemin bir birleştirme yordamının yürütülmesi başlatıldıSystem initiated execution of a merge procedure YazmaWrite Çoklu öğe işlemiMulti-item transaction
Bir öğenin süre sonu (TTL) temelinde öğelerin silinmesinin sistem tarafından başlatılmasıSystem initiated execution of deleting items based on expiration (TTL) of an item YazmaWrite Çoklu öğe işlemiMulti-item transaction
OkumaRead OkumaRead Tek öğe işlemSingle-item transaction
Değişiklik AkışıChange Feed OkumaRead Çoklu öğe işlemiMulti-item transaction
Sayfalandırılmış okumaPaginated Read OkumaRead Çoklu öğe işlemiMulti-item transaction
Sayfalandırılmış sorguPaginated Query OkumaRead Çoklu öğe işlemiMulti-item transaction
Sayfalandırılmış sorgunun bir parçası olarak UDF yürütünExecute UDF as part of the paginated query OkumaRead Çoklu öğe işlemiMulti-item transaction

Çoklu öğe işlemleriMulti-item transactions

Azure Cosmos DB, JavaScript 'te saklı yordamlar, ön ve son Tetikleyiciler, Kullanıcı tanımlı işlevler (UDF 'ler) ve birleştirme yordamları yazmanızı sağlar.Azure Cosmos DB allows you to write stored procedures, pre/post triggers, user-defined-functions (UDFs) and merge procedures in JavaScript. Azure Cosmos DB, veritabanı altyapısının içinde JavaScript yürütmesini yerel olarak destekler.Azure Cosmos DB natively supports JavaScript execution inside its database engine. Saklı yordamları, ön ve son Tetikleyicileri, Kullanıcı tanımlı işlevleri (UDF 'ler) ve birleştirme yordamlarını bir kapsayıcı üzerinde kaydedebilir ve daha sonra bunları Azure Cosmos veritabanı altyapısı içinde işlem temelli olarak yürütebilirsiniz.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. JavaScript 'e uygulama mantığı yazmak, denetim akışının doğal ifadesine, değişken kapsamı, atamaya ve veritabanı işlemlerinde doğrudan JavaScript dilinde özel durum işleme temelleri tümleştirilmesine olanak tanır.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.

JavaScript tabanlı saklı yordamlar, Tetikleyiciler, UDF 'ler ve birleştirme yordamları, mantıksal bölümün içindeki tüm öğelerde anlık görüntü yalıtımıyla bir çevresel ACID işlemi içinde sarmalanır.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. Yürütülmesi sırasında, JavaScript programı bir özel durum oluşturursa tüm işlem durdurulur ve geri alınır.During the course of its execution, if the JavaScript program throws an exception, the entire transaction is aborted and rolled-back. Ortaya çıkan programlama modeli basit ancak güçlü bir işlemdir.The resulting programming model is simple yet powerful. JavaScript geliştiricileri, bildiğiniz dil yapılarını ve kitaplık temel öğelerini kullanmaya devam ederken dayanıklı bir programlama modeli alırlar.JavaScript developers get a durable programming model while still using their familiar language constructs and library primitives.

Doğrudan veritabanı altyapısının içinde JavaScript yürütme özelliği, bir kapsayıcının öğelerine karşı veritabanı işlemlerinin performans ve işlem yürütme işlemlerini sağlar.The ability to execute JavaScript directly within the database engine provides performance and transactional execution of database operations against the items of a container. Ayrıca, Azure Cosmos veritabanı altyapısı JSON ve JavaScript 'i yerel olarak desteklediğinden, bir uygulamanın tür sistemleri ve veritabanı arasında kesin bir uyumsuzluk yoktur.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.

İyimser eşzamanlılık denetimiOptimistic concurrency control

İyimser eşzamanlılık denetimi, kayıp güncelleştirmeleri ve silmeleri engellemenizi sağlar.Optimistic concurrency control allows you to prevent lost updates and deletes. Eşzamanlı, çakışan işlemler, öğenin sahibi olan mantıksal bölüm tarafından barındırılan veritabanı altyapısının normal kötümser kilitlemesinde tabi.Concurrent, conflicting operations are subjected to the regular pessimistic locking of the database engine hosted by the logical partition that owns the item. İki eşzamanlı işlem, bir mantıksal bölüm içindeki bir öğenin en son sürümünü güncelleştirmeye çalıştığında, bunlardan biri kazanıyacaktır ve diğeri başarısız olur.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. Bununla birlikte, aynı öğeyi aynı anda güncelleştirmeye çalışan bir veya iki işlem daha önce öğenin daha eski bir değerini okuseydi, veritabanı daha önce veya her iki çakışan işlemin öğenin en son değeri olan veya her ikisi tarafından daha önce okunan değerin ne olduğunu bilmez.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. Neyse ki, bu durum Iyimser eşzamanlılık denetimi (OCC) ile birlikte algılanarak iki işlemin veritabanı altyapısının içinde işlem sınırını girmelerini önlenebilir.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, verilerinizi yanlışlıkla başkalarının yaptığı değişikliklerin üzerine yazmalarını önler.OCC protects your data from accidentally overwriting changes that were made by others. Ayrıca başkalarının kendi değişikliklerinizi yanlışlıkla üzerine yazmasını engeller.It also prevents others from accidentally overwriting your own changes.

Bir öğenin eşzamanlı güncelleştirmeleri, Azure Cosmos DB 'in iletişim protokolü katmanına göre OCC ile tabi.The concurrent updates of an item are subjected to the OCC by Azure Cosmos DB’s communication protocol layer. Azure Cosmos veritabanı, güncelleştirdiğiniz (veya sildiğiniz) öğenin istemci tarafı sürümünün Azure Cosmos kapsayıcısındaki öğenin sürümüyle aynı olmasını sağlar.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. Bu, yazma işlemlerinin yanlışlıkla başkalarının üzerine yazılmasına karşı korunmasını sağlar ve tam tersi de geçerlidir.This guarantees that your writes are protected from being overwritten accidentally by the writes of others and vice versa. Çok kullanıcılı bir ortamda, iyimser eşzamanlılık denetimi bir öğenin yanlış sürümünü yanlışlıkla silmenizi veya güncelleştirmenizi önler.In a multi-user environment, the optimistic concurrency control protects you from accidentally deleting or updating wrong version of an item. Bu nedenle, öğeler "kayıp güncelleştirme" veya "kayıp silme" sorunlarına karşı korunur.As such, items are protected against the infamous “lost update” or “lost delete” problems.

Bir Azure Cosmos kapsayıcısında depolanan her öğe için sistem tanımlı _etag özelliği vardır.Every item stored in an Azure Cosmos container has a system defined _etag property. _etag değeri, öğe her güncelleştirildiği zaman otomatik olarak oluşturulur ve sunucu tarafından güncelleştirilir.The value of the _etag is automatically generated and updated by the server every time the item is updated. _etag, sunucunun bir öğenin koşullu olarak güncelleştirilip güncelleştirilmediğini meyeceğine karar vermesini sağlamak için istemci tarafından sağlanan if-match istek üst bilgisi ile kullanılabilir._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. if-match üst bilgisinin değeri sunucudaki _etag değeriyle eşleşiyor, öğe güncellenir.The value of the if-match header matches the value of the _etag at the server, the item is then updated. if-match istek üst bilgisinin değeri artık geçerli değilse, sunucu işlemi "HTTP 412 Önkoşul hatası" Yanıt iletisiyle reddeder.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. İstemci daha sonra öğenin geçerli sürümünü elde etmek için öğeyi yeniden alabilir veya öğe için kendi _etag değeri ile sunucudaki öğenin sürümünü geçersiz kılabilir.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. Ayrıca, bir kaynağın tekrar al gerekip gerekmediğini öğrenmek için _etag if-none-match üstbilgisiyle birlikte kullanılabilir.In addition, _etag can be used with the if-none-match header to determine whether a refetch of a resource is needed.

Öğenin _etag değeri, öğe her güncelleştirildiği zaman değişir.The item’s _etag value changes every time the item is updated. Öğe değiştirme işlemleri için if-match, istek seçeneklerinin bir parçası olarak açıkça ifade edilmesi gerekir.For replace item operations, if-match must be explicitly expressed as a part of the request options. Örnek için GitHub'daki örnek koda bakın.For an example, see the sample code in GitHub. _etag değerler, saklı yordamın dokunabileceği tüm yazılı öğeler için örtülü olarak denetlenir._etag values are implicitly checked for all written items touched by the stored procedure. Herhangi bir çakışma algılanırsa, saklı yordam işlemi geri alacak ve bir özel durum oluşturur.If any conflict is detected, the stored procedure will roll back the transaction and throw an exception. Bu yöntemle, saklı yordam içinde tüm veya yazma işlemleri otomatik olarak uygulanır.With this method, either all or no writes within the stored procedure are applied atomically. Bu, güncelleştirmeleri yeniden uygulamak ve özgün istemci isteğini yeniden denemek için uygulamaya yönelik bir sinyaldir.This is a signal to the application to reapply updates and retry the original client request.

Sonraki adımlarNext steps

Aşağıdaki makalelerde veritabanı işlemleri ve iyimser eşzamanlılık denetimi hakkında daha fazla bilgi edinin:Learn more about database transactions and optimistic concurrency control in the following articles: