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şlem bir belgenin tutarlı kalmasını gerektirirken eşzamanlı bir işlem bu 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 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 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 denetimleri kullanır.
Sunucu istemci kitaplıkları, karamsar eşzamanlılık denetimleri kullanır.
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 denetimleri kullanır.
- İyimser eşzamanlılık kontrolleri
- Veri çakışmasının olası olmadığı veya veritabanı kilitlerinin tutulmasının verimli olmadığı varsayılarak. İ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 içinde okuduğunuz tüm belgeleri izler. İş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ç denemeden sonra 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 belge kilitlerini serbest bırakır. Ayrıca, zaman aşımına uğrarsa veya herhangi bir nedenle başarısız olursa kilitlerini serbest bırakır.
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ı yalıtım 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.
- Veritabanları, kaynakları verimli bir şekilde kullanmak için 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 taahhüt edilmemiş 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 anlaşmazlıkları çözmek için eşzamanlılık denetimleri uygulamalıdır.
Cloud Firestore, işlemlerin serileştirilebilir şekilde yalıtılmasını sağlar. Cloud Firestore içindeki işlemler, serileştirilir ve taahhüt süresine göre izole edilir.
Taahhüt zamanına göre serileştirilebilir izolasyon
Cloud Firestore, her işleme zaman içinde tek bir noktayı 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 korur ve aşağıdakileri 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 ç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ını inceleyin.