İşlem serileştirilebilirliği ve yalıtımı

Bu sayfada işlemsel veri çekişmesi, serileştirilebilirlik ve izolasyon açıklanmaktadır. İşlem kodu örnekleri için bunun yerine işlemlere ve toplu yazmalara bakın.

İşlemler ve veri çekişmesi

Bir işlemin başarılı olması için, okuma işlemleriyle 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 kalkarsa, o işlem işlemle veri çekişmesi durumuna girer.

Veri çekişmesi
İki veya daha fazla operasyon aynı belgeyi kontrol etmek için rekabet ettiğinde. Örneğin, bir işlem bir belgenin tutarlı kalmasını gerektirebilirken eşzamanlı bir işlem o belgenin alan değerlerini güncellemeye çalışabilir.

Cloud Firestore, işlemlerden birini geciktirerek veya başarısız olarak veri çekişmesini çözer. Cloud Firestore istemci kitaplıkları, veri çekişmesi nedeniyle başarısız olan işlemleri otomatik olarak yeniden dener. Sınırlı sayıda yeniden denemeden sonra işlem işlemi başarısız olur ve bir 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 verirken 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 kontrollerini kullanır.

Mobil/web SDK'larında veri çekişmesi

Mobil/web SDK'ları (Apple platformları, Android, Web, C++) veri çekişmesini çö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 dayanmaktadır. İyimser işlemler, diğer operasyonların verileri değiştirmesini engellemek için veritabanı kilitlerini kullanmaz.

Mobil/web SDK'ları, yüksek gecikme süresine ve güvenilmez bir ağ bağlantısına sahip ortamlarda çalışabildikleri için iyimser eşzamanlılık kontrolleri kullanır. Belgeleri yüksek gecikmeli bir ortamda kilitlemek çok fazla veri çekişme hatasına neden olur.

Mobil/Web SDK'larında bir işlem, işlem içinde okuduğunuz tüm belgelerin kaydını tutar. İşlem, yazma işlemlerini yalnızca işlemin yürütülmesi sırasında bu belgelerin hiçbiri değişmediğinde tamamlar. Herhangi bir belge değiştiyse işlem işleyicisi işlemi yeniden dener. Birkaç denemeden sonra işlem temiz bir sonuç alamazsa veri çekişmesi nedeniyle işlem başarısız oluyor.

Sunucu istemci kitaplıklarında veri çekişmesi

Sunucu istemci kitaplıkları (C#, Go, Java, Node.js, PHP, Python, Ruby) veri çekişmesini çözmek için kötümser eşzamanlılık kontrolleri kullanır.

Kötümser eşzamanlılık kontrolleri
Veri çekişmesinin muhtemel olduğu varsayımına dayanmaktadı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 süresini ve veritabanına güvenilir bir bağlantı olduğunu varsaydıkları için kötümser eşzamanlılık denetimleri kullanır.

Sunucu istemci kitaplıklarında işlemler, okudukları belgelere kilitler yerleştirir. Bir belgedeki işlemin kilidi, diğer işlemlerin, toplu yazmaların ve işlemsel olmayan yazmaların o belgeyi değiştirmesini engeller. Bir işlem, taahhüt zamanında belge kilitlerini serbest bırakır. Ayrıca herhangi bir nedenle zaman aşımına uğradığında veya arızalandığında kilitlerini açar.

Bir işlem bir belgeyi kilitlediğinde, diğer yazma işlemlerinin işlemin kilidini açmasını beklemesi gerekir. İşlemler kilitlerini kronolojik sıraya göre alırlar.

Serileştirilebilir izolasyon

İşlemler arasındaki veri çekişmesi, veritabanı izolasyon düzeyleriyle yakından ilgilidir. Bir veritabanının yalıtım 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ı gereksinimlerinden kaynaklanır:

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

Düşük yalıtım düzeyine sahip sistemlerde, bir işlem içindeki bir okuma işlemi, eşzamanlı bir işlemdeki kaydedilmemiş değişikliklerden hatalı verileri okuyabilir.

Serileştirilebilir izolasyon, en yüksek izolasyon seviyesini tanımlar. Serileştirilebilir izolasyon şu anlama gelir:

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

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

Cloud Firestore, işlemlerin serileştirilebilir izolasyonunu garanti eder. Cloud Firestore'daki işlemler taahhüt süresine göre serileştirilir ve izole edilir.

Taahhüt süresine göre serileştirilebilir izolasyon

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

Bir işlemin fiili olarak yürütülmesi belirli bir zaman aralığı 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 destekler ve şunları garanti eder:

  • Cloud Firestore, işlemleri taahhüt süresine göre sırayla gerçekleştirir.
  • Cloud Firestore, daha sonraki bir taahhüt süresiyle işlemleri eşzamanlı işlemlerden yalıtır.

Eşzamanlı işlemler arasında veri çekişmesi durumunda Cloud Firestore, çekişmeyi çözmek için iyimser ve kötümser eşzamanlılık kontrollerini kullanır.

Bir işlem içinde izolasyon

İşlem yalıtımı aynı zamanda bir işlem içindeki yazma işlemleri için de geçerlidir. Bir işlem içindeki sorgulamalar ve okumalar, o işlem içindeki önceki yazma işlemlerinin sonuçlarını görmez. Bir işlem içindeki bir belgeyi değiştirseniz veya silseniz bile, o işlemde okunan tüm belgeler, işlemin yazma işlemlerinden önce, taahhüt zamanında belgenin sürümünü döndürür. Belge o zaman mevcut değilse okuma işlemleri hiçbir şey döndürmez.

Veri çekişmesiyle ilgili sorunlar

Veri çekişmeleri ve bunların nasıl çözüleceği hakkında daha fazla bilgi için sorun giderme sayfasına bakın.