Asp.net içerisinde bir işlemin sistem geneli aynı anda sadece bir kez çalışmasını sağlamak.

Asp.net projemizde doğal olarak birden fazla istek benzer zamanlarda gelebiliyor. Örnek verelim bir barkod veriyoruz. Elimizde bir barkod aralığı var. işlemimiz talep geldiğinde aralığı ilerletip oradaki rakamı bir sonraki değeri ürüne aratayacağız. Hali ile veri bütünlüğünü sağlamak için transaction kullanıyoruz. Ancak aynı anda iki kişi istek yapınca işler karışmasın istiyoruz. Ben öncelikle transaction isolation level değerimizi değiştirerek denedim.  “SERIALIZABLE” seviyesinde tüm tabloyu kitliyor lakin ben mi hata yaptım bilmiyorum ancak aynı anda işlem yaptığında birisi hata veriyordu. En güzel çözüm aslında bir kuyruk yapısı kullanmam ve bir consumer sıradan bu istekleri işlemesi ancak kullanıcı bir sonuç dönmem gerekiyordu ve bir message queue yapısı projeye kurmak istemedim. Çözüm olarak olarak https://github.com/madelson/DistributedLock/ kütüpanesini kullandım. Özetle timeout süresince block içerisinde   verdiğimiz işlemi yapıyor ve işlem bittiğinde bir sonraki istek yapan kısım çalışıyor ve bu durum sadece o kodu kullanan kısımları etkiliyor.

var myLock = new SystemDistributedLock("SystemLock");

using (myLock.Acquire())
{
	// this block of code is protected by the lock!
}

Bu şekilde bir kullanımı var ancak ben bi tık abstract edip

public static class SystemLock {
public static void Lock(string key, Action action) {
var @lock = new SystemDistributedLock(key);
using(@lock.Acquire())
{
action();
}
}
}

Kullanımımız SystemLock.Lock(“BarkodAta”, () => { SetBarcod(“9780123456786”); } )

Eğer sizin daha iyi çözümleriniz varsa lütfen benimle de paylaşınız.

Bir cevap yazın