Aracılığıyla paylaş


İşlemler ve iyimser eşzamanlılık denetimi

UYGULANANLAR: NoSQL

Veritabanı işlemleri, verilerde yapılan eşzamanlı değişikliklerle başa çıkmak için güvenli ve öngörülebilir bir programlama modeli sağlar. SQL Server gibi geleneksel ilişkisel veritabanları, saklı yordamları ve/veya tetikleyicileri kullanarak iş mantığını yazmanıza, doğrudan veritabanı altyapısı içinde yürütülmek üzere sunucuya göndermenize olanak sağlar. Geleneksel ilişkisel veritabanlarında JavaScript, Python, C#, Java gibi işlemsel olmayan uygulama programlama dili ve veritabanı tarafından yerel olarak yürütülen işlemsel programlama dili (T-SQL gibi) gibi iki farklı programlama diliyle ilgilenmeniz gerekir.

Azure Cosmos DB'deki veritabanı altyapısı, anlık görüntü yalıtımı ile tam ACID (Bölünmezlik, Tutarlılık, Yalıtım, Dayanıklılık) uyumlu işlemleri destekler. Kapsayıcının mantıksal bölümü kapsamındaki tüm veritabanı işlemleri, bölümün çoğaltması tarafından barındırılan veritabanı altyapısında işlemsel olarak yürütülür. Bu işlemler hem yazma (mantıksal bölüm içindeki bir veya daha fazla öğeyi güncelleştirme) hem de okuma işlemlerini içerir. Aşağıdaki tabloda farklı işlemler ve işlem türleri gösterilmektedir:

İşlem İşlem Türü Tek veya Çok Öğeli İşlem
Ekle (ön/son tetikleyici olmadan) Write Tek öğeli işlem
Ekle (ön/son tetikleyici ile) Yazma ve Okuma Çok maddeli işlem
Değiştir (ön/son tetikleyici olmadan) Write Tek öğeli işlem
Değiştir (ön/son tetikleyici ile) Yazma ve Okuma Çok maddeli işlem
Upsert (ön/son tetikleyici olmadan) Write Tek öğeli işlem
Upsert (ön/son tetikleyici ile) Yazma ve Okuma Çok maddeli işlem
Sil (ön/son tetikleyici olmadan) Write Tek öğeli işlem
Sil (ön/son tetikleyici ile) Yazma ve Okuma Çok maddeli işlem
Saklı yordam yürüt Yazma ve Okuma Çok maddeli işlem
Birleştirme yordamının sistem tarafından başlatılan yürütülmesi Write Çok maddeli işlem
Bir öğenin süre sonu (TTL) temelinde öğeleri silmeyi sistem tarafından başlatılan yürütme Write Çok maddeli işlem
Okundu Okuma Tek öğeli işlem
Değişiklik Akışı Okundu Çok maddeli işlem
Sayfalandırılmış Okuma Okundu Çok maddeli işlem
Sayfalandırılmış Sorgu Okundu Çok maddeli işlem
Sayfalandırılmış sorgunun parçası olarak UDF yürütme Okundu Çok maddeli işlem

Çok öğeli işlemler

Azure Cosmos DB, JavaScript'te saklı yordamlar, ön/son tetikleyiciler, kullanıcı tanımlı işlevler (UDF) ve birleştirme yordamları yazmanızı sağlar. Azure Cosmos DB, veritabanı altyapısı içinde JavaScript yürütmesini yerel olarak destekler. Saklı yordamları, ön/son tetikleyicileri, kullanıcı tanımlı işlevler (UDF) ve birleştirme yordamlarını bir kapsayıcıya kaydedebilir ve daha sonra bunları Azure Cosmos DB veritabanı altyapısında işlemsel olarak yürütebilirsiniz. JavaScript'te uygulama mantığı yazmak, doğrudan JavaScript dilinde veritabanı işlemleri içinde özel durum işleme temel öğelerinin denetim akışının, değişken kapsamının, atamanın ve tümleştirmenin doğal ifade edilmesini sağlar.

JavaScript tabanlı saklı yordamlar, tetikleyiciler, UDF'ler ve birleştirme yordamları, mantıksal bölümdeki tüm öğeler arasında anlık görüntü yalıtımıyla bir ortam ACID işlemi içinde sarmalanmıştır. Yürütme sırasında JavaScript programı bir özel durum oluşturursa tüm işlem durdurulur ve geri alınır. Sonuçta elde edilen programlama modeli basit ancak güçlüdür. JavaScript geliştiricileri, tanıdık dil yapılarını ve kitaplık temel öğelerini kullanmaya devam ederken dayanıklı bir programlama modeline sahip olur.

JavaScript'i doğrudan veritabanı altyapısı içinde yürütebilme özelliği, bir kapsayıcının öğelerine karşı veritabanı işlemlerinin performans ve işlem yürütmesini sağlar. Ayrıca, Azure Cosmos DB veritabanı altyapısı JSON ve JavaScript'i yerel olarak desteklediğinden, bir uygulamanın türü sistemleri ile veritabanı arasında bir empedans uyumsuzluğu yoktur.

İyimser eşzamanlılık denetimi

İyimser eşzamanlılık denetimi, kayıp güncelleştirmeleri ve silmeleri önlemenizi sağlar. Eşzamanlı olarak ç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 kilitlenmesine tabidir. İki eşzamanlı işlem mantıksal bölüm içindeki bir öğenin en son sürümünü güncelleştirmeye çalıştığında, bunlardan biri kazanır ve diğeri başarısız olur. Ancak, aynı öğeyi eşzamanlı olarak güncelleştirmeye çalışan bir veya iki işlem daha önce öğenin eski bir değerini okuduysa, veritabanı çakışan işlemlerden biri veya her ikisi tarafından daha önce okunan değerin gerçekten öğenin en son değeri olup olmadığını bilmez. Neyse ki bu durum, iki işlemin veritabanı altyapısı içindeki işlem sınırına girmesine izin vermeden önce İyimser Eşzamanlılık Denetimi (OCC) ile algılanabilir. OCC, verilerinizi başkaları tarafından yapılan değişikliklerin üzerine yanlışlıkla yazılmasını engeller. Ayrıca başkalarının kendi değişikliklerinizin üzerine yanlışlıkla yazmasını da engeller.

ETag ve HTTP üst bilgilerini kullanarak iyimser eşzamanlılık denetimi uygulama

Azure Cosmos DB kapsayıcısında depolanan her öğenin sistem tanımlı _etag özelliği vardır. öğesinin _etag değeri, öğe her güncelleştirildiğinde sunucu tarafından otomatik olarak oluşturulur ve güncelleştirilir. _etag sunucunun bir öğenin koşullu olarak güncelleştirilip güncelleştirilmeyeceğine karar vermesine izin vermek için istemci tarafından sağlanan if-match istek üst bilgisi ile birlikte kullanılabilir. Üst bilginin değeri if-match sunucudaki değeriyle _etag eşleşir, öğe daha sonra güncelleştirilir. İstek üst bilgisinin if-match değeri artık geçerli değilse, sunucu işlemi "HTTP 412 Önkoşul hatası" yanıt iletisiyle reddeder. İstemci daha sonra öğeyi yeniden getirerek sunucudaki öğenin geçerli sürümünü alabilir veya öğe için kendi _etag değeriyle sunucudaki öğenin sürümünü geçersiz kılabilir. Ayrıca, _etag bir kaynağın if-none-match yeniden kullanılması gerekip gerekmediğini belirlemek için üst bilgiyle birlikte kullanılabilir.

Öğe _etag her güncelleştirildiğinde öğenin değeri değişir. Öğe değiştirme işlemleri için, if-match istek seçeneklerinin bir parçası olarak açıkça ifade edilmelidir. Bir örnek için GitHub'daki örnek koda bakın. _etag değerleri saklı yordam tarafından dokunulan tüm yazılı öğeler için örtük olarak denetlenmektedir. Herhangi bir çakışma algılanırsa saklı yordam işlemi geri alır ve bir özel durum oluşturur. Bu yöntemle saklı yordamdaki yazma işlemlerinin tümü veya hiçi atomik olarak uygulanır. Bu, uygulamanın güncelleştirmeleri yeniden uygulamasına ve özgün istemci isteğini yeniden denemesine ilişkin bir sinyaldir.

İyimser eşzamanlılık denetimi ve genel dağıtım

Bir öğenin eşzamanlı güncelleştirmeleri, Azure Cosmos DB'nin iletişim protokolü katmanı tarafından OCC'ye tabi tutulur. Tek bölgeli yazma işlemleri için yapılandırılmış Azure Cosmos DB hesapları için Azure Cosmos DB, güncelleştirdiğiniz (veya sildiğiniz) öğenin istemci tarafı sürümünün Azure Cosmos DB kapsayıcısında öğenin sürümüyle aynı olmasını sağlar. Bu, yazma işlemlerinizin başkalarının yazma işlemleri tarafından yanlışlıkla üzerine yazılmasını ve tam tersinin korunmasını sağlar. Çok kullanıcılı bir ortamda iyimser eşzamanlılık denetimi, bir öğenin yanlışlıkla silinmesini veya yanlış sürümünün güncelleştirilmesini engeller. Bu nedenle, öğeler kötü amaçlı "kayıp güncelleştirme" veya "silme kaybı" sorunlarına karşı korunur.

Çok bölgeli yazma işlemleriyle yapılandırılmış bir Azure Cosmos DB hesabında, veriler yerel bölgedeki verilerle eşleşiyorsa _etag ikincil bölgelere bağımsız olarak işlenebilir. Yeni veriler ikincil bölgede yerel olarak işlendikten sonra merkez veya birincil bölgede birleştirilir. Çakışma çözümleme ilkesi yeni verileri merkez bölgesiyle birleştirirse, bu veriler yeni _etagile genel olarak çoğaltılır. Çakışma çözümleme ilkesi yeni verileri reddederse, ikincil bölge ve özgün verilerine _etaggeri alınır.

Sonraki adımlar

Aşağıdaki makalelerde veritabanı işlemleri ve iyimser eşzamanlılık denetimi hakkında daha fazla bilgi edinin: