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.)