Bu sayfada işleme veri anlaşmazlığı, serileştirilebilirlik ve yalıtım açıklanmaktadır. İşlem kodu örnekleri için işlemler ve toplu yazmalar başlıklı makaleyi inceleyin.
İşlemler ve veri çakışması
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ştirilmemiş olması gerekir. Başka bir işlem bu dokümanlardan birini değiştirmeye çalışırsa söz konusu işlem, işlemle veri çakışması durumuna girer.
- Veri çakışması
- İki veya daha fazla işlem aynı dokümanı kontrol etmek için rekabet ettiğinde. Örneğin, bir işlemde bir belgenin tutarlı olması gerekirken 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 hale getirerek veri anlaşmazlığını çözer. 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 erteleneceğ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ı olan ortamlarda çalışabildiğinden iyimser eşzamanlılık denetimleri kullanır. Yüksek gecikmeli bir ortamda belgeleri kilitlemek ç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. İşlem, yazma işlemlerini yalnızca bu dokümanlardan hiçbiri işlem sırasında değiştirilmemişse tamamlar. Herhangi bir belge değiştiyse işlem işleyici işlemi yeniden dener. İşlem birkaç deneme sonrasında net bir sonuç alamazsa veri çakışması nedeniyle başarısız olur.
Sunucu istemci kitaplıklarında veri çakışması
Sunucu istemci kitaplıkları (C#, Go, Java, Node.js, PHP, Python, Ruby), veri anlaşmazlığını çözmek için kötümser eşzamanlılık denetimleri kullanır.
- Kötümser eşzamanlılık kontrolleri
- Veri çakışmasının olası olduğu varsayılarak. 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üresi ve veritabanı ile güvenilir bir bağlantı olduğunu varsaydıkları için karamsar eşzamanlılık denetimleri kullanır.
Sunucu istemci kitaplıklarında işlemler, okudukları belgelere kilit yerleştirir. Bir işlem tarafından dokümana uygulanan kilit, diğer işlemlerin, toplu yazma işlemlerinin ve işlem dışı yazma işlemlerinin söz konusu dokümanı değiştirmesini engeller. İşlemler, taahhüt sırası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 bir dokümanı kilitlediğinde diğer yazma işlemlerinin, işlemin kilidini açmasını beklemesi gerekir. İşlemler kronolojik sırayla kilitlenir.
Serileştirilebilir izolasyon
İşlemler arasındaki veri çakışması, veritabanı izolasyonu düzeyleriyle yakından ilgilidir. Bir veritabanının yalıtım düzeyi, sistemin eşzamanlı işlemler arasındaki anlaşmazlıkları ne kadar iyi yönettiğini belirtir. Çakışmalar aşağıdaki veritabanı koşullarından 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.
İzolasyon düzeyi düşük olan sistemlerde, bir işlemdeki okuma işlemi, eşzamanlı bir işlemdeki bağlanmamış değişikliklerden yanlış veriler okuyabilir.
Serileştirilebilir yalıtım, en yüksek yalıtım düzeyini tanımlar. Serileştirilebilir yalıtım ş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.
Bu garanti, veritabanı paralel olarak birden fazla işlem gerçekleştirirken bile 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 içindeki işlemler, serileştirilir ve taahhüt süresine göre izole edilir.
Kaydetme süresine göre serileştirilebilir izolasyon
Cloud Firestore, her işleme tek bir zamanı temsil eden bir taahhüt zamanı atar. Cloud Firestore, bir işlemin değişikliklerini veritabanına kaydettiğinde, işlemdeki tüm okuma ve yazma işlemlerinin tam olarak kaydetme zamanında gerçekleştiğini varsayabilirsiniz.
Bir işlemin gerçekte yürütülmesi için biraz zaman gerekir. Bir işlemin yürütülmesi, taahhüt zamanından ö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 taahhüt zamanına göre sırayla taahhüt eder.
- Cloud Firestore, daha sonraki bir taahhüt süresiyle işlemleri eşzamanlı işlemlerden ayırır.
Eşzamanlı işlemler arasında veri çakışması olması durumunda Cloud Firestore, çakışmayı çözmek için iyimser ve kötümser eşzamanlılık denetimlerini kullanır.
İşlem içinde yalıtım
İşlem yalıtımı, 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çindeki önceki yazma işlemlerinin sonuçlarını görmez. Bir işlemde bir dokümanı değiştirseniz veya silseniz bile, söz konusu işlemdeki tüm doküman okumaları, işlemin yazma işlemlerinden önce, taahhüt sırasındaki doküman sürümünü döndürür. Belge o tarihte mevcut değilse okuma işlemleri hiçbir şey döndürmez.
Veri anlaşmazlığıyla ilgili sorunlar
Veri çakışması ve bunların nasıl çözüleceği hakkında daha fazla bilgi için sorun giderme sayfasını inceleyin.