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

UYGULANANLAR: NOSQL

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. SQL Server gibi geleneksel ilişkisel veritabanları, saklı yordamları ve/veya tetikleyicileri kullanarak iş mantığını yazmanızı ve doğrudan veritabanı altyapısında yürütülmek üzere sunucuya göndermenizi sağlar. Geleneksel ilişkisel veritabanlarında JavaScript, Python, C#, Java gibi işlemsel olmayan uygulama programlama dili olan iki farklı programlama diliyle ilgilenmeniz gerekir. ve veritabanı tarafından yerel olarak yürütülen işlem programlama dili (T-SQL gibi).

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) Yazma Tek öğeli işlem
Ekle (ön/son tetikleyici ile) Yazma ve Okuma Çok maddeli işlem
Değiştir (ön/son tetikleyici olmadan) Yazma Tek öğeli işlem
Değiştir (ön/son tetikleyici ile) Yazma ve Okuma Çok maddeli işlem
Upsert (ön/son tetikleyici olmadan) Yazma Tek öğeli işlem
Upsert (ön/son tetikleyici ile) Yazma ve Okuma Çok maddeli işlem
Silme (ön/son tetikleyici olmadan) Yazma Tek öğeli işlem
Silme (ön/son tetikleyici ile) Yazma ve Okuma Çok maddeli işlem
Saklı yordamı yürütme Yazma ve Okuma Çok maddeli işlem
Birleştirme yordamının sistem tarafından başlatılan yürütülmesi Yazma Çok maddeli işlem
Bir öğenin süre sonu (TTL) temelinde öğeleri silmeyi sistem tarafından başlatılan yürütme Yazma Çok maddeli işlem
Okuma Okuma Tek öğeli işlem
Değişiklik Akışı Read Çok maddeli işlem
Sayfalandırılmış Okuma Read Çok maddeli işlem
Sayfalandırılmış Sorgu Read Çok maddeli işlem
Sayfalandırılmış sorgunun parçası olarak UDF yürütme Read Ç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' ler) 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şlevleri (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, atamasının ve tümleştirilmesinin 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 empedans uyuşmazlığı 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ı, ç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 daha eski bir değerini okuduysa, ç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ı veritabanı 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 yanlışlıkla yapılan değişikliklerin üzerine yazılmasını engeller. Ayrıca başkalarının kendi değişikliklerinizin üzerine yanlışlıkla yazmasını da önler.

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. Ardından istemci, sunucudaki öğenin geçerli sürümünü almak için öğeyi yeniden getirebilir 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. Ö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ı yordam içindeki yazma işlemlerinin tümü veya hiçi atomik olarak uygulanır. Bu, uygulamanın güncelleştirmeleri yeniden uygulaması ve özgün istemci isteğini yeniden denemesi için 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ı (veya tam tersi) koruma altına alınması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 "kayıp silme" 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 özgün verilerine ve _etagöğesine geri 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: