Bu sayfada, işlemsel veri çekişmesi, 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şlemleri tarafından alınan belgelerin, işlem dışındaki işlemler tarafından değiştirilmemesi gerekir. Başka bir işlem bu dokümanlardan birini değiştirmeye çalışırsa işlem, işlemle veri çekişmesi durumuna girer.
- Veri çekişmesi
- Aynı belgeyi kontrol etmek için iki veya daha fazla işlem rekabet ettiğinde Örneğin, bir işlemin tutarlı kalması için bir belge gerekirken 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 kılarak 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 başarısız olur ve hata mesajı döndürülür:
ABORTED: Too much contention on these documents. Please try again.
Hangi işlemin başarısız olacağına veya gecikeceğ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ı, karamsar eşzamanlılık kontrollerini kullanır.
Mobil/web SDK'larında veri çakışması
Mobil/web SDK'ları (Apple platformları, Android, Web, C++), veri çekişmesini çözmek için iyimser eşzamanlılık denetimlerini kullanır.
- İyimser eşzamanlılık kontrolleri
- Veri çekişmesinin olası olmadığı veya veritabanı kilitlerinin tutulmasını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 gecikme süresine ve güvenilir olmayan ağ bağlantısına sahip ortamlarda çalışabildikleri için iyimser eşzamanlılık kontrollerini kullanır. Yüksek gecikmeli bir ortamda belgelerin kilitlenmesi, çok fazla veri çekişmesi hatasına neden olur.
Mobil/Web SDK'larında bir işlem, işlem içinde okuduğunuz tüm belgeleri takip eder. İşlem, yazma işlemlerini yalnızca bu dokümanlardan hiçbiri işlemin yürütülmesi sırasında değişmediyse tamamlar. Herhangi bir belge değişirse işlem işleyici işlemi yeniden dener. İşlem birkaç kez yeniden denendikten sonra temiz bir sonuç alınamazsa veri çekişmesi nedeniyle işlem 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 çekişmesini çözmek için karamsar eşzamanlılık kontrollerini kullanır.
- Karamsar eşzamanlılık kontrolleri
- Veri çekişmesinin olası olduğu varsayımına dayanır. Karamsar işlemler, diğer işlemlerin verileri değiştirmesini önlemek için veritabanı kilitlerini kullanır.
Sunucu istemci kitaplıkları, veritabanına düşük gecikme süresi ve güvenilir bağlantı olduğunu varsaydıkları için karamsar eşzamanlılık kontrollerini kullanır.
Sunucu istemci kitaplıklarında, işlemler okudukları dokümanlara kilit yerleştirir. Bir işlemin doküman üzerindeki kilidi, diğer işlemlerin, toplu yazma işlemlerinin ve işlemsel olmayan yazma işlemlerinin bu dokümanı değiştirmesini engeller. Bir işlem, doküman kilitlerini commit sırasında 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, kilitlerini kronolojik sırayla alır.
Serileştirilebilir izolasyon
İşlemler arasındaki veri çakışması, veritabanı yalıtım düzeyleriyle yakından ilişkilidir. Bir veritabanının yalıtım düzeyi, sistemin eşzamanlı işlemler arasındaki çakışmaları ne kadar iyi yönettiğini açıklar. Çakışma, aşağıdaki veritabanı koşullarından kaynaklanır:
- İşlemler için doğru ve tutarlı veriler gerekir.
- Kaynakları verimli bir şekilde kullanmak 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 kaydedilmemiş değişikliklerden yanlış veriler okuyabilir.
Serileştirilebilir izolasyon, en yüksek izolasyon düzeyini tanımlar. Serializable 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ı birden fazla işlemi paralel olarak yürütürken bile geçerli olmalıdır. Veritabanı, bu garantiyi bozacak çakışmaları çözmek için eşzamanlılık kontrolleri uygulamalıdır.
Cloud Firestore, işlemlerin serileştirilebilir yalıtımını garanti eder. Cloud Firestore içindeki işlemler, commit zamanına göre sıralanır ve yalıtılır.
Serializable isolation by commit time
Cloud Firestore, her işleme tek bir zaman noktasını temsil eden bir onaylama zamanı atar. Cloud Firestore bir işlemin değişikliklerini veritabanına işlediğinde, işlem içindeki tüm okuma ve yazma işlemlerinin tam olarak işleme zamanında gerçekleştiğini varsayabilirsiniz.
Bir işlemin gerçek yürütülmesi için belirli bir süre gerekir. Bir işlemin yürütülmesi, onaylama zamanından ö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, onaylanma zamanına göre sırayla onaylar.
- Cloud Firestore, işlemleri daha sonraki bir onaylama zamanına sahip eşzamanlı işlemlerden ayırır.
Eşzamanlı işlemler arasında veri çekişmesi olması durumunda, Cloud Firestore, çekişmeyi çözmek için iyimser ve kötümser eşzamanlılık kontrollerini kullanır.
İşlem içinde yalıtım
İşlem yalıtımı, bir işlemdeki yazma işlemleri için de geçerlidir. Bir işlemdeki sorgular ve okumalar, o işlemdeki önceki yazma işlemlerinin sonuçlarını görmez. Bir işlem içinde bir dokümanı değiştirseniz veya silseniz bile, bu işlemdeki tüm doküman okumaları, işlemin yazma işlemlerinden önce, commit zamanındaki doküman sürümünü döndürür. Okuma işlemleri, doküman o sırada mevcut değilse hiçbir şey döndürmez.
Veri çekişmesiyle ilgili sorunlar
Veri çekişmesi ve bunların nasıl çözüleceği hakkında daha fazla bilgi için sorun giderme sayfasını inceleyin.