Optimistic lock aslında lock-free locking diye de geçer. Normalde veri tabanlarında bir kayıt üzerinde çalışılırken lock (kilitleme) yapılır ki başka birisi aynı kayıt üzerinde çalışmasın. Locking (pesimistic locking) dediğimiz işlemler de session bazlı çalışır. Lock isteği yapıldığı anda başlar commit ya da rollback yapılana kadar kilitli kalır. Bunun birkaç tane sıkıntısı var. Birincisi performans sorunu denilebilir, bir diğer sorun da lock’un deadlock’a gebe olabilmesidir. Bunların yanında yönetimi zor olabilir, askıda kalan locklar olabilir vs.vs.
Optimistik lock ise; her kayıt için fazladan bir kolonda version numarası tutularak kaydın daha önceden değişmediğinin garantilenmesi için bir yapı oluşturulmasıdır. Mesela uye tablosunda isim alanını değiştireceksiniz, uyenizin de id kolonu ile belirleyeceksiniz, sql sorgunuz şu şekilde olur;
update uye set isim=’kenan’ where id = 1;
Bunu şu şekilde değiştirelim
update uye set isim = ‘kenan’, version = version + 1 where id = 1 and version = 2;
Bu güncelleme kodundan önce version numarasını select atarak çektiğimizi varsayalım ve version numaramız 2.
Şimdi bu update atılırken version numarası 2 ise update et diyoruz. Şayet araya başkası girip bu update çalıştırmadıyda version numarası 2 olarak duracaktır. Peki birisi girip update çalıştırdıysa ne olacak?
O zaman version numarası 3 olmasını bekliyoruz. 3 olduğu durumda where koşulundaki version = 2 kısmı eşleşmeyeceği için 0 kayıt update olacak. O zaman biz de daha önce bu kaydın başkası tarafından update edildiğini anlayabiliriz.
Merhabalar,
Optimistic lock aslında lock-free locking diye de geçer. Normalde veri tabanlarında bir kayıt üzerinde çalışılırken lock (kilitleme) yapılır ki başka birisi aynı kayıt üzerinde çalışmasın. Locking (pesimistic locking) dediğimiz işlemler de session bazlı çalışır. Lock isteği yapıldığı anda başlar commit ya da rollback yapılana kadar kilitli kalır. Bunun birkaç tane sıkıntısı var. Birincisi performans sorunu denilebilir, bir diğer sorun da lock’un deadlock’a gebe olabilmesidir. Bunların yanında yönetimi zor olabilir, askıda kalan locklar olabilir vs.vs.
Optimistik lock ise; her kayıt için fazladan bir kolonda version numarası tutularak kaydın daha önceden değişmediğinin garantilenmesi için bir yapı oluşturulmasıdır. Mesela uye tablosunda isim alanını değiştireceksiniz, uyenizin de id kolonu ile belirleyeceksiniz, sql sorgunuz şu şekilde olur;
update uye set isim=’kenan’ where id = 1;
Bunu şu şekilde değiştirelim
update uye set isim = ‘kenan’, version = version + 1 where id = 1 and version = 2;
Bu güncelleme kodundan önce version numarasını select atarak çektiğimizi varsayalım ve version numaramız 2.
Şimdi bu update atılırken version numarası 2 ise update et diyoruz. Şayet araya başkası girip bu update çalıştırmadıyda version numarası 2 olarak duracaktır. Peki birisi girip update çalıştırdıysa ne olacak?
O zaman version numarası 3 olmasını bekliyoruz. 3 olduğu durumda where koşulundaki version = 2 kısmı eşleşmeyeceği için 0 kayıt update olacak. O zaman biz de daha önce bu kaydın başkası tarafından update edildiğini anlayabiliriz.
Bu kullanıma optimistic locking deniyor.
bir nevi veritabanı sisteminin kendi lock mekanizması dışında kendimiz bir lock mekanizması kuruyoruz diyebiliriz sanırım. ?
Yani öyle de söylenebilir.