Bir işlem hiçbir zaman birden fazla nesneye yayılmayacaksa, nesne başına İyimser Eşzamanlılık Serileştirilebilirlik anlamına mı geliyor?


13

Aşağıdakileri sağlayan bir sistem verildiğinde:

  • Nesne başına iyimser eşzamanlılık kontrolü / sürüm oluşturma (CAS kullanarak - Kontrol Et ve Ayarla)
  • Asla tek bir nesneden daha fazlasını kapsaması gerekmeyen işlemler.
  • Anlık Görüntü Yalıtımı

Bu sistem serileştirilebilir mi?

Gönderen Anlık İzolasyon

Yazma eğriliği bozukluğunda, iki işlem (T1 ve T2) aynı anda çakışan bir veri kümesini (örn. V1 ve V2 değerleri) okur, eşzamanlı olarak ayrık güncellemeler yapar (örn. T1 V1, T2 V2 güncellemeleri) ve nihayetinde eşzamanlı olarak taahhüt diğeri tarafından yapılan güncelleme. Sistem serileştirilebilir olsaydı, T1 veya T2'nin "önce" ortaya çıkması ve diğeri tarafından görülmesi gerektiği için böyle bir anomali imkansız olurdu. Buna karşılık, enstantane izolasyon yazma eğriliği anormalliklerine izin verir.

Somut bir örnek olarak, V1 ve V2'nin tek bir kişi, Phil tarafından tutulan iki denge olduğunu düşünün. Banka, her ikisinde de tutulan toplamın asla negatif olmaması şartıyla V1 veya V2'nin bir açık vermesine izin verecektir (yani V1 + V2 ≥ 0). Her iki bakiye şu anda 100 $. Phil aynı anda iki işlem başlatır: T1, V1'den 200 dolar çeker ve T2, V2'den 200 dolar çeker.

Buna dayanarak, görüntü eğriltme potansiyeline sahip olmanın, Anlık Görüntü İzolasyonunu garanti eden bir sistemin Tekilleştirilemediğini garanti etmesinin tek nedeni olduğu görülmektedir.

Ancak, bir işlemin birden fazla nesneye yayılmasına izin vermeyen bir sistemde (yukarıdaki örnek V1 ve V2'de) yazma eğriliğinin oluşması imkansız görünmektedir .

Bu nedenle, yukarıda açıklanan sistem serileştirilebilir. Bu doğru mu?


1
Bence cevap evet, veritabanı aksi takdirde yazma çarpıklığı getirecek işlemleri iptal izin verilir - işlemler tek bir nesneyi okumak / yazmak için sınırlı ise, o zaman ya ayrık ya da çarpışan.
pjc50

2
Ben de ilk taahhüt için yinelenen kayıtları önlemek için bir yol gerekir düşünüyorum. Bu durumda, iki iyimser yazarın her biri boş bir enstantane görebilir ve kaydın yeni olduğunu görebilir ve böylece her biri 0 versiyonunda olan iki nesneniz olabilir.
Matthew Mark Miller

Yanıtlar:


1

Hayır, şartlarınızın serileştirilebilir olarak düşünmemiz gereken bir sistemle sonuçlandığını düşünmüyorum.

Anlık görüntü yalıtımı, bir işlemin tüm işlem boyunca aynı veri kümesini görmesini sağlayan bir tekniktir. Anlık görüntü yalıtımı bazı garantiler sağlar, ancak işlemlerin gerçekte nasıl çalıştığını anlamak için gerekli tüm özellikleri tanımlamaz (anlık görüntü yalıtımını ve MVCC'yi birleştirmeyi seçmedikçe).

Anlık görüntü yalıtımı en çok MVCC, Çoklu Sürüm Tutarlılık Denetimi kullanılarak uygulanır. MVCC, işlemlerin anlık görüntüleri bağlamında daha fazla ayrıntı tanımlar: yalnızca çakışma yazarken (yalnızca konumlar veya uygulamaya bağlı olarak konumlar + değerler) yalıtım gerektirdikleri söylenir. MVCC rahat bir tutarlılık modeli sağlar ve yazma eğriliği çeker.

Rahat tutarlılık modellerinin anlaşılması zordur çünkü izolasyon ve tam izolasyon arasında bir melez gibidirler.

Önce katı bir eşzamanlılık modeli ile başlayalım. Biri diğerinin okuduğu veya yazdığı herhangi bir veriye yazarsa (ve tersi) iki işlem birbirinden izole edilmelidir .

Bir işlemin neden veri okuduğunu bilmediğimizde, farklı bir değer okumasının ilgili istemcinin davranışını değiştirebileceğini varsaymalıyız, bu yüzden çakışan işlemlerin durumu yalıtımı gösterir. İzolasyon olmadan, bir anlık görüntüdeki eski verilerin okunması rahat bir tutarlılık gösterebilir, başka bir terim tutarsızlıktır, yani hata.

Sadece işlemler tarafından okunan veya yazılan kesin verileri dikkate almamız gerekir, bu setin dışındaki verilerin dikkate alınması gerekmez. Bununla birlikte, bir işlem tarafından okunan veriler hakkında konuşurken, zorunlu olarak herhangi bir "meta" veriyi (ve kısıtlamaların kontrolü gibi meta işlemler tarafından okunan veri ve meta verileri) içermemiz gerektiğini fark etmek önemlidir. Meta verilere örnek olarak / meta işlemleri şunlardır: benzersiz bir yeni birincil anahtarın tanımlanması; diğeri tüm bir sütunun toplamıdır; bir diğeri ise bir şeyi aramak ve onu bulmak değil; aralık aramaları veya toplamlar. Bu, @ Matthew'un yinelemeleri önleme hakkındaki yorumunun yanı sıra durumu düşündüğü @Tersosauros cevabına da gider.

Örneğin, bu, her iki satır da eklendiğinde (benzersiz bir birincil anahtar kısıtlaması varsayarak) iki işlemin üst üste geldiği (yalıtım gerektirdiği) anlamına gelir çünkü anahtar kısıtlamasını kontrol etmek, tüm birincil anahtar sütununu okumakla eş anlamlıdır. Başka bir örnek olarak, bir şeyi aramak ve bulmak, bir değeri okumak gibidir, ancak onu bulmak, sütundaki her değere bakmak gibidir.

MVCC yalnızca çakışan veya çakışan yazma işlemlerine karşı koruma sağlar, ancak okumalara karşı da koruma sağlamaz (bu işlem tarafından yazılmadığı sürece). Bu nedenle, MVCC'de bir tutarlılık hatası elde etmek için tek yapmamız gereken, diğer işlem eski verileri kullanmaya devam ederken diğer işlemin (eski işlemin anlık görüntüsü alındıktan sonra gerçekleşir, ancak önce gerçekleşir) değiştirildiği bir şey okumaktır. bu eski verilere dayanarak, güncel verilere göre karar verir. Nedenini sandığınızdan daha kolay.

Rahat tutarlılık, potansiyel olarak tutarsız veya hataya yatkın demenin başka bir yoludur. (Rahat tutarlılık, "NoSQL" den eğilimli başka bir popüler hata biçimi olan nihai tutarlılık ile karıştırılmamalıdır.)

Sorunuzda, işlemlerin hiçbir zaman birden fazla nesneye yayılması gerekmediğini söylediğinizde, bunun hem okuma hem de yazma hem de tutarlılık denetimi, tüm sütun toplamları, devamsızlık kontrolleri, aralık aramaları vb.Gibi meta veriler (ve meta işlemler) için geçerli olması gerekir. .: öyleyse, o zamana kadar çok iyi.

Ancak...

Tek tek nesnelerde (nesne kilitleme yerine söyle) anlık görüntü yalıtımı (MVCC) kullandığınızı sorunuzdan alıyorum. (CAS'dan da bahsettiniz; karşılaştır ve takas et, ve test et ve ayarla'yı duydum, ancak benzer olduğunu varsaysam da kontrol et ve ayarla).

Soru yazmanız bana "nesnelerin" birden fazla alanı olduğunu, aksi takdirde sorunun şartlarının gereksiz olacağını belirtir.

Bu nedenle, snapshott'ed / MVCC ile işlenen nesnelerinizde birden fazla alan olduğundan, tek nesnelerin içine eğriliğe yazma eğiliminiz vardır. İki işlem aynı nesneyi aynı anda güncellerse, nesne üzerindeki eşzamanlı başka bir işlem tarafından eski haline getirilen nesnenin değerinin bir alanı okunabilir ve böylece potansiyel tutarsızlık (aka hata) bilinmeden devam edilebilir.

Bunun yerine, başka bir işlem zaten devam ediyorsa, iki işlemin (güncelleme için) aynı nesneye bakmasını bile engelleyecek nesne kilitleme kullanabilirsiniz.

Alternatif bir anlık görüntü yalıtımı formunun MVCC'nin kırık yazma kümesi karşılaştırma modelini kullanmadan yapılabileceğine inanıyorum. Böylece, okuma kümesini de içerecek şekilde karşılaştırma kümesini salt yazmadan tanıtabilirsiniz. Daha sonra aynı nesneyi güncelleyen iki işlem yazma eğriliğine neden olmaz (çünkü daha sonra işlem yapmaya çalışan işlem iptal edilir). Bunun, tanımladığınız soruna uygun bir çözüm olabileceğini düşünüyorum, çünkü çok nesneli işlemleri önleyerek MVCC'nin bizi satın alacağı avantajın çoğunu zaten alıyorsunuz.

(Sadece okunan veya yazılan tam ve belirli öğeleri / alanları dikkate almamız gerekir, ancak yazma eğriliğini (yani hata) önlemek için meta işlemler sırasında potansiyel olarak meta veri olarak dahil edilenleri dahil etmeliyiz. veya meta verileri dikkate almayı başaramazsak (meta işlemler tarafından potansiyel olarak kullanılır), hataya izin verecek bir modelimiz vardır.)


0

Ben düşünüyorum @ pjc50 , belirtilen Vurgu ekledi (:) " eğer o zaman "Cevap evet" işlemlerin tek bir nesneyi okuma / yazma ile sınırlıdır". Ancak, bunun nereye düştüğü tek bir nesne fikrinde .

Anlık Görüntü izolasyonundan alınan örnekte , T1 ve T2 herhangi bir değer paylaşmaz. Bununla birlikte, " ikisi de diğerinin gerçekleştirdiği güncellemeyi görmedi " kaynağı için hala bir yazma eğriliği potansiyeli taşımaktadır . Bu nedenle , bir işlemin işlemden önce serileştirilebilmesini sağlayan diğer tüm güncellemeleri görme yeteneği .

Gönderen serializability :

Bir çizelgenin seri hale getirilebilirliği, aynı işlemlerle seri bir çizelgeye (yani, hiçbir işlem çakışması olmadan sıralı) eşdeğer (sonuçta, veritabanı durumu, veri değerleri) anlamına gelir.

Ne yazık ki, bu nedenle (ve @Matthew Mark Miller'ın işaret ettiği gibi), durumu ve değerleri de dikkate almalıyız . Bu durum dikkate alındığında, herhangi bir veritabanı durumu yazıldığında OCC kullanan iki işlemin eğri yazma potansiyeli olacaktır .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.