5 Ağustos 2010 Perşembe

JPA'da @version tagı kullanılarak optimistic locking mekanizmasının sağlanması

JPA'da @version tagı veritabanına birden çok kişinin aynı anda erişmesi durumunda  optimistic locking mekanizmasının kullanılmasını sağlar. Bir tabloda sadece bir tane version alanı olabilir. Normal şartlarda veritabanlarında optimistic veya pessimistic locking kullanılmadığında  birden çok kişi aynı anda veritabanina eriştiğinde birbirini ezme prensibi kullanılıyor yani en son yapılan değişiklik daha önceki değişiklikleri eziyor. Arkadaşımla yaptığımız denemelerde aynı anda  veritabanina eriştikten sonra önce ben değişiklik yapıp commitledim daha sonra arkadaşım değişiklik yapıp commitledi ve onun yaptığı değişiklik benim yaptığım değişikliği ezdi. Version alanı kullanarak yaptığımız denemelerde ise ben veritabanina eriştim ve bazı değişiklikler yaptım ve commitlemedim, daha sonra arkadaşım tabloya erişerek bazı değişiklikler yapmaya çalıştı ama sistem buna ben commit yapmadan izin vermedi.Sistem sadece veritabaninin o anki durumunu görmesine izin verdi.
Version alanının kullanılma mantığı şu şekildedir, kullanıcı veritabanında bir alana eriştiğinde version alanındaki değer kontrol ediliyor sistem tarafından ve kullanıcı herhangi bir değişikli yaptığı anda version alanındaki değer bir kez daha kontrol ediliyor ve eğer bu değer sisteme ilk girildiğinde kontrol edilen değere eşitse (bu değer veritabanında herhangi bir değişiklik yapıldığı zaman değişiyor.) o zaman kullanıcının değişiklik yapmasına izin veriliyor. Version alanındaki değer her değişiklik sonrası bir arttırılıyor.Eğer alana eriştiğimiz andaki version değeriyle değişiklik yaptığımız andaki version değeri farklıysa bu başka birinin bizim sisteme giriş yaptığımız ve değişiklik yaptığımız zaman arasında o alanda başka bir değişiklik yaptığını gösterir ve değişikli yapmamıza izin vermez.Version alanı timestamp( en son değişiklik yapılma tarihi ) veya numeric türde değişken kullanılabilir ama Oracle numeric değişkenlerin kullanılmasını öneriyor.çünkü time stamp değişkenler veritabanında %100 kesin değerleriyle tutulamaz ve neredeyse nano saniye farkla yapılan farklı commitler arasındaki farkı algılayamayabilir.

Not: Arkadaşım Anıl Mercana yardımlarından dolayı teşekkür ediyorum.

Hiç yorum yok:

Yorum Gönder