İşlem serileştirme ve izolasyon

Bu sayfada işlemsel veri çekişmesi, serileştirme ve izolasyon açıklanmaktadır. İşlem kod örnekleri için bunun yerine işlemler ve toplu yazmalar bölümüne bakın.

İşlemler ve veri çakışması

Bir işlemin başarılı olması için, okuma işlemleri tarafından alınan belgelerin işlem dışındaki işlemler tarafından değiştirilmeden kalması gerekir. Başka bir işlem, bu belgelerden birini değiştirmeye çalışırsa söz konusu işlemler, işlemle ilgili bir veri çakışması durumuna girer.

Veri çakışması
İki veya daha fazla işlemin aynı dokümanı kontrol etmek için rekabet etmesi. Örneğin, bir işlemde bir belgenin tutarlı kalması gerekebilir. Eş zamanlı bir işlemde ise dokümanın alan değerleri güncellenmeye çalışılır.

Cloud Firestore, işlemlerden birini geciktirerek veya başarısızlıkla sonuçlandırarak veri anlaşmazlığını çözüme kavuşturur. Cloud Firestore istemci kitaplıkları, veri çakışması nedeniyle başarısız olan işlemleri otomatik olarak yeniden dener. Belirli bir sayıda yeniden denemeden sonra işlem işlemi başarısız olur ve hata mesajı döndürür:

ABORTED: Too much contention on these documents. Please try again.

Hangi işlemin başarısız olacağına veya geciktirileceğine karar verilirken davranış, istemci kitaplığının türüne bağlıdır.

  • Mobil/web SDK'ları, iyimser eşzamanlılık kontrollerini kullanır.

  • Sunucu istemci kitaplıkları, kötümser eşzamanlılık denetimlerini kullanıyor.

Mobil/web SDK'larında veri çakışması

Mobil/web SDK'ları (Apple platformları, Android, Web, C++), veri anlaşmazlığını çözmek için iyimser eşzamanlılık kontrollerini kullanır.

İyimser eşzamanlılık kontrolleri
Veri çekişmesinin muhtemel olmadığı veya veritabanı kilitlerini tutmanın verimli olmadığı varsayımına dayanır. İyimser işlemler, diğer işlemlerin verileri değiştirmesini engellemek için veritabanı kilitlerini kullanmaz.

Mobil/web SDK'ları, yüksek gecikmeli ve güvenilir olmayan ağ bağlantısı içeren ortamlarda çalışabildikleri için iyimser eşzamanlılık denetimlerini kullanır. Belgelerin yüksek gecikmeli bir ortamda kilitlenmesi, çok fazla veri çakışması hatasına neden olur.

Mobil/Web SDK'larında, bir işlem, işlem sırasında okuduğunuz tüm belgelerin kaydını tutar. İşlemin yazma işlemlerini yalnızca yürütme sırasında bu belgelerden hiçbiri değiştirilmediği takdirde tamamlar. Herhangi bir belgede değişiklik olursa işlem işleyici işlemi yeniden dener. Birkaç yeniden denemeden sonra işlem temiz bir sonuç alamazsa veri çakışması nedeniyle işlem başarısız olur.

Sunucu istemci kitaplıklarındaki veri çakışması

Sunucu istemci kitaplıkları (C#, Go, Java, Node.js, PHP, Python, Ruby), kötümser eşzamanlılık denetimleri kullanarak veri anlaşmazlığını çözümler.

Kötümser eşzamanlılık kontrolleri
Veri anlaşmazlığının olası olduğu varsayımını temel alır. Kötümser işlemler, diğer işlemlerin verileri değiştirmesini önlemek için veritabanı kilitlerini kullanır.

Sunucu istemci kitaplıkları, düşük gecikme ve veritabanıyla güvenilir bir bağlantı gerçekleştirdiklerini varsaydıkları için kötümser eşzamanlılık denetimlerini kullanır.

Sunucu istemci kitaplıklarında, işlemler okudukları dokümanlara kilitler yerleştirir. Bir belgedeki işlemin kilidi diğer işlemlerin, toplu yazmaların ve işlemsel olmayan yazmaların söz konusu belgeyi değiştirmesini engeller. Bir işlem, kaydetme zamanında doküman kilitlerini serbest bırakır. Ayrıca zaman aşımına uğraması veya herhangi bir nedenle çalışmaması durumunda kilitlerini açar.

Bir işlem dokümanı kilitlediğinde, diğer yazma işlemlerinin, işlemin kilidini açmasını beklemesi gerekir. İşlemlerde kilitler kronolojik sırayla alınır.

Serileştirilebilir izolasyon

İşlemler arasındaki veri çakışması, veritabanı izolasyonu düzeyleriyle yakından ilgilidir. Bir veritabanının izolasyon düzeyi, sistemin eşzamanlı işlemler arasındaki çakışmaları ne kadar iyi ele aldığını açıklar. Çatışma aşağıdaki veritabanı gerekliliklerinden kaynaklanır:

  • İşlemler için doğru ve tutarlı veriler gerekir.
  • Kaynakların verimli bir şekilde kullanılması için veritabanları, işlemleri eşzamanlı olarak yürütür.

Yalıtım seviyesi düşük olan sistemlerde, işlem içindeki bir okuma işlemi, eşzamanlı işlemdeki kaydedilmemiş değişikliklere ait yanlış verileri okuyabilir.

Serizlenebilir yalıtım, en yüksek yalıtım düzeyini tanımlar. Serileştirilebilir izolasyon, şu anlama gelir:

  • Veritabanının işlemleri seri olarak yürüttüğünü varsayabilirsiniz.
  • İşlemler, eşzamanlı işlemlerdeki kaydedilmemiş değişikliklerden etkilenmez.

Veritabanı paralel olarak birden fazla işlem yürütürken bile bu garanti geçerli olmalıdır. Veritabanı, bu garantiyi ihlal edecek çakışmaları çözmek için eşzamanlılık kontrolleri uygulamalıdır.

Cloud Firestore, işlemlerin seri şekilde izole edilmesini garanti eder. Cloud Firestore'daki işlemler, kaydetme süresine göre serileştirilmiş ve erişime açıktır.

Kaydetme süresine göre serileştirilebilir izolasyon

Cloud Firestore her işleme, zamandaki tek bir noktayı temsil eden bir kaydetme süresi atar. Cloud Firestore, bir işlemin değişikliklerini veritabanında kaydettiğinde işlem içindeki tüm okuma ve yazma işlemlerinin tam olarak kaydetme zamanında gerçekleştiğini varsayabilirsiniz.

Bir işlemin yürütülmesi biraz zaman gerektirir. Bir işlemin yürütülmesi taahhüt süresinden önce başlar ve birden fazla işlemin yürütülmesi çakışabilir. Cloud Firestore, serileştirilebilir izolasyonu onaylar ve şunları garanti eder:

  • Cloud Firestore, işlemleri kaydetme zamanına göre sırayla kaydeder.
  • Cloud Firestore, işlemleri daha ileri bir kaydetme süresiyle eşzamanlı işlemlerden ayırır.

Eşzamanlı işlemler arasında veri çakışması durumunda Cloud Firestore, anlaşmazlığı çözmek için iyimser ve kötümser eşzamanlılık kontrollerini kullanır.

İşlem içinde izolasyon

İşlem izolasyonu, bir işlem içindeki yazma işlemleri için de geçerlidir. Bir işlem içindeki sorgular ve okumalar, söz konusu işlem içinde önceki yazmaların sonuçlarını görmez. Bir işlemdeki belgeyi değiştirseniz veya silseniz bile, bu işlemdeki tüm belge okumaları, işlemin yazma işlemlerinden önce, kaydetme sırasında belgenin sürümünü döndürür. Belge o sırada mevcut değilse okuma işlemleri hiçbir şey döndürmez.

Veri çakışmasıyla ilgili sorunlar

Veri çakışması ve bunların nasıl çözüleceği hakkında daha fazla bilgi için sorun giderme sayfasına göz atın.