NHibernate ile İyimser Denkleme

günü tarafından yayınlandı.

Databasedeki bir kaydın aynı anda birden fazla session tarafından update edilmesi sonucu data kaybı yaşanabiliyor. ReadUncommited şekilde select edilen bir kayıt, update edilene kadar başka bir session tarafından update edilirse, artık güncel olmayan bir kaydı (dirty) update etmiş oluyoruz.

Bunun önüne geçmek için NHibernate’in sunduğu Optimistic Lock’u kullanabiliyoruz. Mapping class’a DynamicUpdate.True ve OptimisticLock.All veya OptimisticLock.Dirty ekleyerek update esnasında bu tablodaki kaydın en güncel halini mi update ettiğimizi kontrol edebiliyoruz. Eğer güncel olmayan kaydı update etmek istersek, bu sayede hata alıp bunu handle edebiliyoruz.

DynamicUpdate.True:
Update SQL’inin runtime’da dinamik olarak oluşmasını sağlıyor.

OptimisticLock.All:
Update statement’ın Where clause’unda kaydın tüm alanlarını orijinal değerleriyle kontrol ederek update esnasında kaydın hiçbir alanının değişmemiş olmasından emin oluyor.

OptimisticLock.Dirty:
Update statement’ın Where clause’una sadece dirty durumdaki (güncel olmayan) alanları ekleyerek kaydın güncelliğinden emin oluyor. Bu şekilde aynı kaydın farklı alanlarını birden fazla session aynanda update edebiliyor.

Özetle:
Amount:100 olan bir kaydı update ederken
NHibernate tarafından oluşturulan

1
UPDATE TABLE SET AMOUNT=110 WHERE ID=1

şeklindeki bir update statement

1
UPDATE TABLE SET AMOUNT=110 WHERE ID=1 AND AMOUNT=100

haline geliyor. Eğer select ile update arasında başka bir session bunun değerini 120 yapmışsa, amount’u 110 olarak güncellememize izin vermiyor.

Bilgi: http://nhforge.org/doc/nh/en/index.html#transactions