İşlem serileştirme ve izolasyon

Bu sayfada işlem verileri çekişmesi, serileştirilebilirlik ve izolasyon açıklanmaktadır. İşlem kodu örnekleri için işlemler ve toplu yazma işlemleri bölümüne bakın.

İşlemler ve veri çekişmesi

Bir işlemin başarılı olması için okuma işlemleri tarafından alınan dokümanların, 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 bu işlem, işlemle veri çekişmesi durumuna girer.

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

Cloud Firestore, işlemlerden birini geciktirerek veya başarısız kılarak veri çakışmasını çö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 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 verilirken davranış, eşzamanlılık kontrollerinin 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 kontrolleri, veri çekişmesinin muhtemel olduğunu varsayar. Kötümser 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ı dokümanlara kilit yerleştirir. Bir işlemin doküman üzerindeki kilidi, diğer işlemlerin, toplu yazma işlemlerinin ve işlem dışı yazma işlemlerinin bu dokümanı değiştirmesini engeller. Bir işlem, doküman kilitlerini tamamlama sırasında kaldırır. Ayrıca, zaman aşımına uğrarsa veya herhangi bir nedenle başarısız olursa kilitlerini kaldırı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 kontrolleri, veri çekişmesinin olası olmadığını veya veritabanı kilitlerini tutmanı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 dokümanları takip eder. İşlem, yazma işlemlerini yalnızca işlemin yürütülmesi sırasında bu dokümanlardan hiçbiri değişmediyse tamamlar. Herhangi bir doküman değiştiyse işlem işleyici, işlemi yeniden dener. İşlem, birkaç yeniden denemeden sonra temiz bir sonuç alamazsa veri çekişmesi nedeniyle başarısız olur.

Eşzamanlılık modu varsayılanları

Standard sürüm için varsayılan değer PESSIMISTIC şeklindedir. Enterprise sürümü için varsayılan değer OPTIMISTIC şeklindedir. Ancak davranış, istemci kitaplığının türüne de bağlıdır:

  • Mobil / web SDK'ları iyimser eşzamanlılık kontrolleri kullanır. Mobil ve web SDK'ları, her zaman iyimser eşzamanlılığı taklit ettikleri için bu ayardan bağımsız olarak davranır.
  • Sunucu istemci kitaplıkları, veritabanı ayarının eşzamanlılık kontrollerini kullanır.

Eşzamanlılık modunu görüntüleme

Veritabanınızın sunucu tarafı eşzamanlılık modunu görüntülemek için gcloud firestore databases describe komutunu çalıştırın:

gcloud firestore databases describe \
  --project=PROJECT_ID \
  --database=DATABASE_ID

Eşzamanlılık modunu değiştirme

Veritabanınızın sunucu tarafı eşzamanlılık modunu değiştirmek için gcloud firestore databases update komutunu çalıştırın:

gcloud firestore databases update \
  --project=PROJECT_ID \
  --database=DATABASE_ID \
  --concurrency-mode=CONCURRENCY_MODE

Bu örnekte:

  • CONCURRENCY_MODE, PESSIMISTIC veya OPTIMISTIC.
  • PROJECT_ID, Google Cloud projenizin kimliğidir.
  • DATABASE_ID, Cloud Firestore veritabanınızın kimliğidir.

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

Mobil ve web SDK'ları, doküman sürümlerinde yazma ön koş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 için yapılandırılmış olsa bile mobil uygulama istemcileri iyimser davranmaya devam eder.

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

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

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üzeyindeki eşzamanlılık modu ayarını kullanır ve varsayılan ayar, sürüme bağlıdır:

  • Enterprise sürümü, tüm koleksiyonları tarayan işlemleri desteklemek için varsayılan olarak iyimser eşzamanlılık kontrollerini kullanır. İyimser eşzamanlılık kontrolleri, çok sayıda dokümanı kilitleyen tarama işlemlerini önlemeye yardımcı olur.

  • Standard sürüm, kötümser eşzamanlılık kontrolleri kullanır ve veritabanına düşük gecikmeli ve güvenilir bir bağlantı olduğunu varsayar.

Serileştirilebilir izolasyon

İşlemler arasındaki veri çekişmesi, veritabanı izolasyon seviyeleriyle yakından ilgilidir. Bir veritabanının izolasyon 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ı gereksinimlerinden 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.

Yalıtım düzeyi düşük olan sistemlerde, bir işlemdeki okuma işlemi, eşzamanlı bir işlemdeki onaylanmamış değişikliklerden yanlış veriler okuyabilir.

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

  • Veritabanının işlemleri sırayla yürüttüğünü varsayabilirsiniz.
  • İşlemler, eşzamanlı işlemlerdeki kaydedilmemiş değişikliklerden etkilenmez.

Bu garanti, veritabanı paralel olarak birden fazla işlem yürütürken 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 serileştirilebilir izolasyonunu garanti eder. Cloud Firestore içindeki işlemler, onay zamanına göre sıralanır ve izole edilir.

Onay zamanına göre serileştirilebilir izolasyon

Cloud Firestore, her işleme tek bir zaman noktasını temsil eden bir tamamlama 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çek anlamda yürütülmesi için belirli bir süre gerekir. Bir işlemin yürütülmesi, onay zamanından önce başlar ve birden fazla işlemin yürütülmesi çakışabilir. Cloud Firestore, serileştirilebilir yalıtımı destekler ve şunları garanti eder:

  • Cloud Firestore, işlemleri onay zamanına göre sırayla onaylar.
  • Cloud Firestore, işlemleri daha sonraki bir onay 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şlemde 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, kaydetme zamanındaki doküman sürümünü döndürür. Belge o sırada mevcut değilse okuma işlemleri hiçbir şey döndürmez.

Veri çekişmesiyle ilgili sorunlar

Veri çekişmesi ve bu sorunun nasıl çözüleceği hakkında daha fazla bilgi için sorun giderme sayfasını inceleyin.