İş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 _etag
ile genel olarak çoğaltılır. Çakışma çözümleme ilkesi yeni verileri reddederse, ikincil bölge ve özgün verilerine _etag
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: