21 Temmuz 2008 Pazartesi

Data Concurtency ve Consistency

Merhabalar arkadaşlar geçte olsa benim gibi tembel adamlara rağmen bir staj bloğuna başlanmış.Bu konuda öncü olanlara ve desteğini bizden esirgemeyen GURU Tonguç abimize çok teşekkür ederim.Siz gibi değerli arkaşalarımızın arasında bana düşmez bir şeyler yazmak ama karşımda sürekli çalışan Süleyman arkadaşımızı görünce onun bu azmi karşısında yazmaktan yorgun düşmüş klavyemin ucunda biriken nağmeler yeniden hortlayarak interruptlarını göndermeye başladı.:)
Tarih 20 Temmuz 2008 eğitimin tarihi ise 12 Temmuz 2008 .Nerdeyse eğitmenimiz Övünç Bozcan abiyi unutacağım.Daha yeni yazıyorum.Eğitmeni unutan eğitimide unutmuş olabilir bundan dolayı yanlış veya eksik yazılarım için şimdiden özür dilerim,düzeltme ve eklemeleriniz içinse sizden rica ederim.

DATA CONCURRENCY VE CONSISTENCY

Tek kullanıcılı databselerde kullanıcı istediği gibi verileri değiştirip okuyabilir.Fakat çok kullanıcılı databselerde birden fazla kullanıcı ayna anda aynı data üzerinde değişiklik yapmak isteyebilir.İşte o zamanda transactionın tutarlı ve anlamlı sonuçlar üretmesi gerekir.Bundan dolayı databasein concurrency ve consistent olması hayati önem taşırmış.

Concurency: Birçok kullanıcının aynı anda aynı kaynağa-dataya ulaşabilmesi demektir.

Consistency:Diğer kullanıcılar kendi transactionlarını gerçekleştirirken her kullanıcı verinin kararlı halini görmesidir.

Transactionlar aynı anda çalışırken veri tabanının consistent nasıl davranacağını karar vermek için araştırmacılar serializability adında transaction isolation model tanımlamışlar. Bu modda transactionlar birkaç yolla çalışırlarken concurently şekilde davranırlar.Transactionlar arasında isolationın bu derecesi genellikle birçok uygulama çalışırken aynı çıktıları üretmeleri arzu edilir.Concurrency locklardan etkilenir fakat bunlardan çok daha fazla bişeydir.

Transaction Isolation Level

Dirty reads:Commit edilmemiş datalar arası işlem yaparken başkasının gelip eski bilgiyi okuması demektir.Oracle da okuyucular datayı değiştirmiş olsalar bile diğer kullanıcı undo blocklardan değişmiş datayı okuyacağından dirty read yoktur.Aşağıdaki gibi sorunu çözer.



Non-Repeatable read:Bir kullanıcı bilgiyi okuyor geçiyor.Hemen ardından başka bir kullanıcı bilgiyi değiştirip commit ediyor.İlk kullanıcı yeniden veriyi okuduğunda ilk veriyle bir tutarsızlık oluyor.Buna deniyor.

Phantom Read:Burayı kaçırmışım galiba ama okuduğum kadarıyla yine bir kullanıcı gelip select yapıyor almak istediğini alıyor.İkinci bir kullanıcı geliyor adamın bu select yaptığı yere insert yapıyor.sonra ilk kullanıcı yeniden select çalıştırdığında aynı veriler elde edilmiyor.Bir üstekine çok benziyor anladığım kadarıyla bundaki tek fark insert edilmesiymiş.

Oracle Isolation Levels

Read Commited:Default olan transaction isolation leveldir.Oracleda her bir sorgu başladığında o ana kadar commit edilmiş bilgileri görür.Boylelikle dirty read olayını da önlemiş olur.

Serializable:Bunda transaction başlamasına kadar olan değişikliklere artı olarakkendi içinde yaptığı INSERT,UPDATE ve DELETE statementlarınada izin verir.
Read-Only:Bu sadece transaction başladığındaki bilgileri görür ve işlem yapar üsteki gibi INSERT,UPDATE ve DELETE statementlarınada izin vermez.

Flashback Concept

Flashback query geçmişte kalan bir bilgiyi elde etmemizi sağlayan birşeydir.Bun sorguyu zaman veya SCN bazında yapabiirsiniz. Bunu yaparkende undolardan yararlanır.Oracle undo retention period adında bir değişken tutar.Bu flashback yapılabilecek noktayı gösterir.

LOCK

Locklar aynı kaynağa ulaşmaya çalışan transactionların concurrency olmasını sağlayan mekanizmadır.Sql statement çalıştırıldığında ORACLE otomatik olarak lock mekanizmasını size sağlar.Oracle yüksek veri tutarlılığı için gerekli olan en düşük lock mekanizmasını kullanır.

Lock yapısı databaseler arası farklılık gösteren ve databaseleri bildiğimiz dosya sisteminden ayıran bir yapıdır.Bu yapıyı databaseler çok farklı şekilde kullandıklarından databaseler arası farklılığı bunlar oluşturur denilebilir.
Oracle okuma yaparken kilit kullanmaz ve kayıtları satır bazında kilitler.Siz bir row üzerinde değişiklik yapıyorsanız sadece o satır kilitlenir.Diğer satırlar bundan etkilenmez.

Databaselerde Lost update denen bir olay var.2 kullanıcı bir veri üzerinde değişiklik yapacak birinci kullanıcı yapıyor commit ediyor ikinci kullanıcı bunu görmeden oda değişiklik yapıp commit etmeye çalışıyor.Fakat yaptığı değişiklik olmayabilir çünkü birinci kullanıcı önceden veriyi değiştirmiştir.Bu durumun kontrol altına alınması gerekir.Bu MsSql de de disconnected layerde var.Bu durumu Oracle 2 şekilde ele alır:

Pessimistic Locking:Oracle’da “SELECT FOR UPDATE ” ile select statement çalıştırıldığı zaman kilit oluşturulur.Birinci kullanıcı raw a eriştiği an kilit oluşturulur,ikinci kullanıcının erişmesi engellenir.Tabi bu durum concurrency’i düşürür.Buda malumunuz istenen bir durum değildir.

Optimistic Locking:Burda durum hakkaten iyimserdir.Select yaptığınızda kilite gerek yoktur.Fakat update kısmında durum kontrol edilir.Oracle default olarak bunu kullanılır ve çeşitli şekillerde implemente eder.

Lock Tipleri
Oracle dataya farklı erişimlerin tutarlılığını sağlamak ve userlar arasındaki o birbirini yıkıcı durumları ortadan kaldırmak için otomatik olarak çeşitli lock mekanizmaları kullanırlar.Bu locklar 3 kategori altında incelenir.

DML locks (veri lockları) :DML lockları veriyi korurlar.Mesela tablo lockları tablonun hepsini,satır lockları ise seçilen satırı korurlar.

DDL locks(dictionary lockları ) :Schema objectlerini korurlar.Mesela tablo tanımları gibi

Internal locks and latches :Datafile gibi Internal olan veritabanı nesnelerini korurlar.

Değerli eğitimcimizden 2 saatte kapabildiklerimi sizinle paylaşmaya çalıştım.Sizde değerli yorumlarınızla katkıda bulunursanız sevinirim.Uykusuz ve yazmak için yazılan bir moda yazıyorum.
Bunu bile zor yazdım.Sabah sabah Anıl Hanımı görmeseydim ve o tılsımlı günaydını işitmeseydim bunuda yazamayacaktım aslında.Bir insan bu kadar ilham kaynağı olabilir.Kendisini o kadar çalışkan ki kendimdeki tembellik cevherini keşfettim.Yoğun olması sebebiyle fazla muhabbetimiz olmadı ama bir keresinde bana “Ah sizin gibi geçliğim eyvah” diyerek sezenişte bulunmuştu.Aslında hani o içimizdeki dinamizm olarak bakarsak ben onun en az 10 yaş üstü gibi görünüyorum. Neyse ben daha fazla geyik yapmadan desteklerinden dolayı Tonguç Abimize ve değerli Anıl Ablamıza teşekkür ederek herkese iyi çalışmalar dileyeyim…

1 yorum:

Tonguç dedi ki...

eline emeğine sağlık.

ama Türkçe'ye biraz daha özen gösterelim.

Bir de Öğünç -> Övünç ;)