Daha önce saga’nın ACID transactionlardaki I yani isolation’ı sağlamadığını not almıştım. Isolation olmaması belli problemlere (anomali) neden oluyor.
- Lost Updates
- Dirty Reads
- Fuzzy/nonrepetable reads
Bunlar içinden dirty reads konusunu saga ekseninde inceleyelim.
Burada dirty read’in oluşma senaryosunu konuşacağız. Bunun engellenmesi için gerekenler bir sonraki yazının konusu olacak.
Tanım olarak şu söylenebilir: Bir saga’nın başka bir saga (local transaction dizisi) tarafından işlenmekte olan veriyi okuması sonucunda aslında yapamayacağı ya da yapmaması gereken bir işlemi yapabilmesidir. Bu durumda ilgili saga diğer saga’nın güvenilmemesi gereken verisine güvenerek bir iş sürecini işletmiş olur.
Detayda boğulmadan senaryo ile bu konuyu açıklayalım.
İki saga olsun.
- Create Order Saga
- Cancel Order Saga
Create Order Saga
- Consumer Service: Müşterinin hesap kredisini düşürsün
- Order Service: Siparişi oluştursun
- Delivery Service: Teslimat başlatsın
Cancel Order Saga
- Consumer Service: Krediyi geri yüklesin
- Order Service: Siparişi iptal etsin
- Delivery Service: Teslimatı iptal etsin. (Problem burada oluşuyor. Sipariş iptal edilemez durumda. Gün vb. kısıtlardan dolayı. Burada rollback olacak)
Sagalarda her adımda transaction commit işlemi yapıldığı için başka sagalar bu durumu netleşmemiş veriyi okuyabiliyorlar.
- Müşterinin hesabında 100 tl var.
- Eski siparişin iptal süreci başlıyor. Cancel Order Saga tetikleniyor. Consumer Service müşterinin bakiyesine 50 tl iade ediyor.
- Bu esnada müşteri başka bir sipariş vermeye çalışıyor. Create Order Saga tetikleniyor ve consumer service müşterinin hesabında 150 tl görüyor.
- Müşteri 130 tl fiyatlı bir ürünü sipariş edebiliyor. (Dirty read oluştu. Müşteri geçici bir veriyi okudu ve kullanamayacağı bir bakiyeyi kullandı.)
- İptal edilmekte olan siparişin iptal edilemeyeceği anlaşıldı ve consumer servis müşterinin bakiyesine biraz önce eklediği 50 tl’yi düştü.
- Müşteri yeni sipariş oluştururken bakiyesi 20 tl’ye düşmüştü. Şimdi 50 tl daha düştü ve -30 tl bakiye oluştu.
Sistem hiç izin vermemesi gereken bir sürece Isolation olmadığı için izin vermiş oldu.
Burada countermeasure kavramı ortaya çıkıyor. Bir takım işlemler yaptık ve sonucunda istemediğimiz iş kurallarını ihlal etmiş bir durumla karşılaştık. Bu durumu en başından engelleyen tasarım kararları verilebilir. İşte bunlar countermeasures olarak ifade ediliyorlar. Bir sonraki yazıda detaylarını konuşalım.