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 tetikleyicileri kullanarak iş mantığını yazmanıza ve ardından doğrudan veritabanı altyapısı içinde yürütülmek üzere sunucuya göndermenize olanak sağlar.

Geleneksel ilişkisel veritabanlarında iki farklı programlama diliyle ilgilenmeniz gerekir: JavaScript, Python, C# veya Java gibi işlem dışı bir uygulama programlama dili; ve veritabanı tarafından yerel olarak yürütülen T-SQL gibi işlemsel bir programlama dili.

Azure Cosmos DB'deki veritabanı motoru, anlık görüntü yalıtımı ile tam ACID (atomiklik, tutarlılık, izolasyon, 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ı motorunda 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 listelenmiştir:

İşlem İşlem türü Tek veya çok öğeli işlem
Ekle (ön/son tetikleyici olmadan) Yaz Tek öğeli işlem
Ekle (ön/son tetikleyici ile) Yazma ve okuma Çok maddeli işlem
Değiştir (ön/son tetikleyici olmadan) Yaz Tek öğeli işlem
Değiştir (ön/son tetikleyici ile) Yazma ve okuma Çok maddeli işlem
Upsert (ön/son tetikleyici olmadan) Yaz Tek öğeli işlem
Upsert (ön/son tetikleyici ile) Yazma ve okuma Çok maddeli işlem
Sil (ön/son tetikleyici olmadan) Yaz Tek öğeli işlem
Sil (ön/son tetikleyici ile) Yazma ve okuma Çok maddeli işlem
Saklı prosedürü çalıştır Yazma ve okuma Çok maddeli işlem
Sistem tarafından birleştirme yordamının yürütülmesi başlatıldı. Yaz Çok maddeli işlem
Öğelerin süresi dolduğu zaman (TTL) bir öğeye göre silinme işlemi, sistem tarafından başlatıldı. Yaz Çok maddeli işlem
Okundu Okundu Tek öğeli işlem
Akışı değiştirme 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'yi çalıştırma. Okundu Çok maddeli işlem

Çok öğeli işlemler

Azure Cosmos DB, JavaScript'te saklı yordamlar, tetikleyiciler, kullanıcı tanımlı işlevler 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' ler) 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 durdurulup 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 uyuşmazlığı yoktur.

İyimser eşzamanlılık denetimi

İyimser eşzamanlılık denetimi (OCC), kayıp güncelleştirmeleri ve silmeleri önlemenizi sağlar. Eşzamanlı ve çakışan işlemler, öğenin sahibi olan mantıksal bölüm tarafından barındırılan veritabanı motorunun 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, ç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 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ğerinin _etag değeriyle eşleşiyorsa, öğ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 seçip 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 tekrar getirilmesinin gerekip gerekmediğini belirlemek için if-none-match başlıkla 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. Saklı yordamın etkileşimde bulunduğu tüm yazılı öğelerin değerleri örtük olarak kontrol edilir. 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çbiri 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şka kişilerin yazma işlemleriyle yanlışlıkla üzerine yazılmasının ve onların da sizinkilere yazılmasının önlenmesini sağlar. Ç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 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ölgeye entegre ederse, bu veriler yeni _etag ile küresel 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

Veritabanı işlemleri ve iyimser eşzamanlılık denetimi hakkında daha fazla bilgi edinin: