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ış, eşzamanlılık denetimlerinin türüne bağlıdır.
Eşzamanlılık kontrolleri
Eşzamanlılık modu, yapılandırılabilir bir veritabanı seçeneğidir. Cloud Firestore aşağıdaki eşzamanlılık modlarını destekler:
PESSIMISTIC: Karamsar eşzamanlılık denetimleri, veri çekişmesinin olası olduğunu varsayar. Karamsar işlemler, diğer işlemlerin verileri değiştirmesini önlemek için veritabanı kilitlerini kullanır.Karamsar eşzamanlılık kontrollerinde işlemler, okudukları belgelere 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.
OPTIMISTIC: İyimser eşzamanlılık denetimleri, veri çekişmesinin olası olmadığını veya veritabanı kilitlerinin tutulmasının verimli olmadığını varsayar. İyimser işlemler, diğer işlemlerin verileri değiştirmesini engellemek için veritabanı kilitlerini kullanmaz.İyimser eşzamanlılık kontrolleriyle 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ştiyse işlem işleyici işlemi yeniden dener. İşlem birkaç kez yeniden denendikten sonra temiz bir sonuç alınamazsa işlem, veri çekişmesi nedeniyle başarısız olur.
Eşzamanlılık modu varsayılanları
Standard sürümünde varsayılan değer PESSIMISTIC'dır. Enterprise sürümünde varsayılan değer OPTIMISTIC'dır. Ancak davranış, istemci kitaplığının türüne de bağlıdır:
Mobil/web SDK'ları iyimser eşzamanlılık kontrollerini kullanır. Mobil ve web SDK'ları, her zaman iyimser eşzamanlılığı taklit ettiklerinden bu ayardan bağımsız olarak çalışır.
Sunucu istemci kitaplıkları, veritabanı ayarının eşzamanlılık denetimlerini kullanır.
Mobil/web SDK'larındaki veri çakışması
Mobil ve web SDK'ları, doküman sürümlerinde yazma önkoşullarını kullanarak iyimser eşzamanlılık işlemlerini taklit eder. Bu emülasyon, veritabanının eşzamanlılık modu ayarından bağımsız olarak gerçekleşir. Mobil ve web SDK'ları yerleşik işlemler özelliğini kullanmaz. Bu nedenle, veritabanı eşzamanlılık modu PESSIMISTIC olarak yapılandırılmış olsa bile mobil istemciler iyimser davranmaya devam eder.
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.
Sunucu istemci kitaplıklarında veri çakışması
Sunucu istemci kitaplıkları (C#, Go, Java, Node.js, PHP, Python, Ruby) yerleşik işlemler özelliğini kullanır. Bu işlemler, veritabanı düzeyinde eşzamanlılık modu ayarını kullanır ve varsayılan değer, sürüme bağlıdır:
Enterprise sürümü, koleksiyonların tamamını tarayan işlemleri desteklemek için varsayılan olarak iyimser eşzamanlılık kontrollerini kullanır. İyimser eşzamanlılık denetimleri, çok sayıda dokümanda kilitlenen tarama işlemlerinden kaçınmaya yardımcı olur.
Standart sürümde karamsar eşzamanlılık kontrolleri kullanılır ve veritabanına düşük gecikmeli ve güvenilir bir bağlantı olduğu varsayılı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 seviyesi düşük olan sistemlerde, bir işlem içindeki okuma işlemi, eşzamanlı bir işlemdeki kaydedilmemiş değişikliklerden yanlış veriler okuyabilir.
Serializable isolation, en yüksek izolasyon 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ı 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 onay 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 onaylama 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, çekişmeyi çözmek için Cloud Firestore 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şlem içindeki 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 okuma işlemleri, 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.