SORU
18 Kasım 2008, Salı


CouchDB işlemler ve kilitleri yapabilir miyim?

Hareketleri (begin, commit ya da geri alma), kilit (güncelleme için seçin) yapmak istiyorum. Nasıl belge örnek bir db yapsam olmaz mı?

Düzenleme:

Bu durumda:

  • Müzayede sitesi çalıştırmak istiyorum.
  • Ve satın almak iyi yönetmeyi düşünüyorum.
  • Doğrudan bir alım olursa bu miktar sıfırdan büyük ise madde kaydındaki miktar alanını azaltma var ama. Bu kilitler ve hareketleri yüzden yardım istiyorum.
  • Kilitler ve/veya hareketleri olmadan bu adrese nasıl bilmiyorum.

CouchDB ile bu işi çözebilir miyim?

CEVAP
18 Kasım 2008, Salı


Hayır. CouchDB bir "eşzamanlılık" modeli. iyimser kullanır En basit terimlerle, bu geçerli belge sürümü gönderdiğin ne maç değilse senin güncelleme ile birlikte belgenin bir sürümünü göndermek ve CouchDB değişikliği reddetmesi anlamına gelir.

Aldatıcı basit, gerçekten. CouchDB için işlem göre çok normal senaryolar hususlarında edebilirsiniz. CouchDB öğrenirken bir nevi kendi İÇERİSİNDE etki alanı bilgi dışarı atmak için olsa gerek. Yararlı SQL tabanlı bir dünya için Koltuğu kalıp etmeye çalışmaktansa bir üst düzeyden sorunlara yaklaşım.

Tutma stok takip

Size anlatılan sorunu öncelikle bir stok sorunu var. Eğer bir belge açıklayan bir öğe varsa, ve "kullanılabilir miktar", işleyebilir bu gibi sorunları eşzamanlılık: . için bir alan içerir

  1. CouchDB birlikte gönderdiği _rev mülkiyet belgesi, not almak
  2. Eğer sıfırdan büyük ise miktar alanını azaltma,
  3. Güncelleştirilmiş belge geri, _rev özelliğini kullanarak gönderin
  4. _rev şu anda saklı numarası ile eşleşirse, yapılması!
  5. Eğer bir çatışma _rev uyuşmuyor (zaman) ise, en yeni belge sürümü almak

Bu durumda, düşünmek için iki olası başarısızlık senaryoları vardır. En son belge sürümü bir VERİTABANI içinde sadece sen hallet 0, bir miktar var ve gerçekten satın almak istediklerini alamayacakları kullanıcıyı uyarmak. En son belge sürümü bir miktar sadece güncelleştirilmiş verileri ile bu işlemi tekrarlayın 0, daha büyük ve baştan başlayın. Bu bir İLİŞKİSEL biraz fazla bir işi yapmak için zorlar ve eğer sık sık çakışan güncelleştirmeler ise biraz can sıkıcı olabilir.

Şimdi, cevap sadece bir VERİTABANI içinde aynı şekilde CouchDB şeyler yapacaksın bunu gerektirir verdi. Bu sorun biraz farklı yaklaşabilirim:

Bir "ana ürün" bütün tanımlayıcı veri içeren belge (adı, resim, Açıklama, Fiyat, vb.) ile başlamak istiyorum "Envanter bilet" her örneği, product_key claimed_by alanlar için belge. bir ben eklemek istiyorum o zaman Eğer çekiç modeli satan, ve 20 tane satmak zorunda iseniz, hammer-1, hammer-2, vb, gibi tuşları olan belgeler her kullanılabilir çekiç temsil gerekebilir.

Bana görelim o zaman, beni müsait çekiç listesi, fonksiyon azaltmak ile veren bir görünüm oluşturmak istiyorum". toplam Bu tamamen manşet kapalı, ama çalışan bir görünüm gibi görüneceğini bir fikir verecektir.

Göster

function(doc) 
{ 
    if (doc.type == 'inventory_ticket' && doc.claimed_by == null ) { 
        emit(doc.product_key, { 'inventory_ticket' :doc.id, '_rev' : doc._rev }); 
    } 
}

Bu bana mevcut bir liste verir "bilet", ürün anahtarı tarafından. Elimden tut bir grup bu zaman birini satın almak istiyor çekiç, yineleme yoluyla gönderme güncellemeleri (kullanarak id _rev) kadar başarılı iddia (daha önce iddia Biletleri sonuçlanacak bir güncelleme hatası).

Azaltmak

function (keys, values, combine) {
    return values.length;
}

Bu fonksiyonu sadece inventory_ticket sahipsiz öğelerin toplam sayısını verir, "çekiç" satın almak için kullanılabilir. nasıl söyleyebilirsiniz azaltmak

Uyarılar

Bu çözüm sunduk özellikle bu sorun için toplam düşünerek yaklaşık 3.5 dakika temsil eder. Bunu yapmanın daha iyi yolları olabilir! Bu oldukça çelişkili güncellemeleri azaltmak ve yeni bir güncelleme ile bir çatışma yanıt vermek gerek aşağı keser dedi. Bu model altında, birden fazla kullanıcının birincil ürün veri girişini değiştirmeye kalkışmak zorunda kalmazsınız. Çok kötü, birden fazla kullanıcı ve çalışan iddia tek bir bilet, ve eğer yakaladı birkaç olanlardan görünümü, sadece hareket halinde bir sonraki bilet ve tekrar deneyin.

Referans: https://wiki.apache.org/couchdb/Frequently_asked_questions#How_do_I_use_transactions_with_CouchDB.3F

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • kidrauhl

    kidrauhl

    15 Ocak 2007
  • TechShowsYou

    TechShowsYou

    3 Mart 2011
  • THELIFEOFPRICE

    THELIFEOFPRI

    16 Mart 2011