Bu yazıda bir view sorgusu (view query) çalıştırırken kullanılan stale (bayatlık) özelliğinden bahsedilecektirCouchbase'de bir view sorgusu yaptığınızda (bir view'i çağırdığınızda, view query) stale özelliği varsayılan olarak
update_after olmaktadır. Bunun anlamı şu anda var olan indekse göre sorgu sonucu alınır ve daha sonra couchbase indekslemeyi kendi üzerinde yapar. Bu durumda varsayılan seçenekte
bayat veri gelme olasılığı vardır. Çünkü indeksleme sonuç alındıktan sonra yapılmaktadır.
Eğer son değişiklikleri almak istiyorsanız stale (bayatlık) özelliğini
false olarak vermeniz gerekir. Bu şekilde yapıldığında sorgu öncesi view indexlenir ve sonuç ondan sonra döndürülür. Bunun anlamı indeksleme yapılmasından dolayı sorgu sonucunun gecikmeli geleceğidir. Ancak veri en güncel hali olacaktır.
Eğer stale özelliği
ok (veya
true) seçilirse ne sorgu öncesinde ne de sorgu sonrasında herhangi bir indeksleme yapılmaz. Örneğin değişmeyen eski tarihli içeriklere bakan bir view için bu özellik kullanılabilir.
Couchbase bir çok NoSQL ürünü gibi transaction'ı desteklemez. Transaction kavramı hakkında bilgi için
bu sayfaya bakabilirsiniz. Couchbase desteklemese de iş katmanında (business logic) transaction'a ihtiyacınız olabilir.
Couchbase'da iki tane yöntem kullanılabilir:
- Lease-out pattern (Kiralama deseni) : Döküman üzerindeki bir bilgiyi korumak için kullanılır. Bu şekilde aynı anda başka süreçler bir süreç işini bitirmediği durumda bu bilgi üzerinde bir değişiklik yapamaz. Örneğin online bilet satan bir sistemde bir bilet sadece tek bir kere satılabilmesi gerekir.
- Two-phase commits (İki fazlı işleme) : Tüm dökümanlarda değişiklike tamamlanır. Eğer değişiklikle başarılı ise commit işlemi yapılır. Eğer bir tane başarısız durum varsa tüm dökümanlarda işlemler geri alınır
Lease-out Pattern - Kiralama Deseni
Örneğin online bir bilet satan sistem düşünelim.
- Tek koltuk bir kere satılır. Aynı koltuk iki kere satılamaz
- Bir koltuk boşta ise kullanıcı o koltuk için bilet alabilir
- Bir kullanıcı bilet alma işlemini sonlandırmayabilir
- Bir kullanıcı bilet alma işleminde vazgeçtiğinde o bilet tekrar satılabilir olmalıdır
Bu ihtiyaçları sağlamak için aşağıdaki gibi bir yöntem kullanabiliriz:
- Her bilet için bir döküman olmalıdır
- Her döküman için bir Lease/Reserve (Kirala/Rezerv) belirli bir süre rezerv sistemi kurulmalıdır
- Her koltuk için tekrar boşalacağı bir durum oluşabilmelidir
Örneğin , ayırmak için uygun olan bir biletin durumu aşağıdaki gibi olabilir:
{
"ticket_id" : "ticket1",
"seat_no" : 100,
"state" : "AVAILABLE"
}
Görüldüğü gibi state (durum) özelliği AVAILABLE (uygun) şeklindedir. Bir bilet ayırtıldığında aşağıdaki şekle çevrilebilir:
{
"ticket_id" : "ticket1",,
"seat_no" : 100,
"state" : "INCART",
"expiry" : <timestamp>
}
INCART, şu anda alınma sürecine girildiğini, expiry dönemine kadar bu şekilde kalacağı belirtilmiş olunur. Eğer expire zamanı için satın alma işlemi tamamlanırsa satıldı durumuna getirilebilir:
{
"ticket_id" : "ticket1",
"seat_no" : 100,
"state" : "SOLD",
"expiry" : 0
}
Two-phase Commits - İki Fazlı İşleme
Bu süreçte işlem yapılması gereken tüm dökümanlara transaction'un durumu ile ilgili bilgi eklenir. Transaction süreci içinde üçüncü bir döküman yaratılır. Asıl dökümanlarda sırasıyla gerçekli güncelleme işlemleri yapılır ve hangi transaction içinde ise o bilgi dökümana eklenir. Sırasıyla işlemler yapılır. Eğer işlemler başarılı ise transaction dökümanı tamamlandıya çekilir ve dökümanlardan transaction bilgisi kaldırılır. Eğer bir hata olursa, transaction işleminde geçirilen dökümanlarda (transction özelliği set edilmiş olanlar işlemden geçirilmiş demek) işlemlerin geri alınması sağlanır.
Örneğin iki kişi arasında puan transferi yapan bir örnek couchbase'in developer sitesinde aşağıdaki gibi gösterilmiştir:

karen'den dipti'ye 100 puan transfer edilmektedir. Önce dipti 100 puan artırılır ve trans değeri set edilir. Ardından karen'den 100 puan azaltılır ve trans değeri set edilir. Artık tüm içerikler bitti ise transaction durumu commit'e çekilir.
Hata oluştuğu durumlarda da nasıl davranılacağı aşağıdaki gibi gösterilmiştir:

Hata olan aşamada trans değeri dolu olanlarda işlem geri alınır.