15 Kasım 2015 Pazar

Veri Tutarlılığının Yönetilmesi, LOCK (Kilit) Mekanizması

Data Koruması:
Oracle verinin tutarlılığını korumak adına bütün çakışmaları engeller. Yani bir kullanıcı başka bir kulalnıcyı engelleyebilir. Buna LOCK denir. Oracle bu durum için bir çözüm oluşturmuştur. Lock nedirle başlayalım.
LOCKS (Kilitlenmeler):
İki kullanıcı aynı anda aynı tablonun aynı satırına bir sorgu çekse, select, update, insert işlemi yapmak istese lockmekanizması devreye girer. İkisi aynı işlemi yapması zorunluluğu yok, bir kullanıcı update yaparken diğeri selectyapabilir. İşte bu durumlarda lock olur. Bildiğimiz kilitlenme değil oracle databasei tutarlılık gözeteceğinden. İlk işlemi yapan kullanıcının işini bitirmesi gerekecektir, transaction sonlanmalıdır. Yani commit, rollback vs yapması gerekmektedir.
Yukarıdaki resimdeki işlemi analiz edelim. Transaction1 bir employees tablosundaki employee_idsi 100 olan kişinin maaşına 100 tl eklemiş. Transaction2de aynı kullanıcının maaşına %10 eklemekte. O zaman transaction2, transaction1’in işlemini bitirmesini bekleyecektir. Oracle satır bazında lock işlemi yapar.
Bir kullanıcı komple bir tabloya update, insert işlemi yapıyor olsa diğer kullanıcı yine satır bazında işlem bile yapsalock devreye girecektir. Yani oracle tablo bazında da lock işlemi yapar. Oracle bu işlemi tutarsızlığı engellemek için uygular.
Tablo yapısında bir değişiklik yapmak istediğimiz zamanda lock devreye girer. Eğer yazdığımız syntaxın sonuna for update eklersek yine lock devreye girer.
Birden fazla kullanıcı için ilk kullanıcı diğer kullanıcıları locklayacak bir işlem yaparsa ve aşağıdaya doğru kullanıcılar birbirlerini locklayacak işlem yaparsa, en üstten en alta doğru transactionların sonlanması gerekmektedir. bu durumda yukarıdan aşağıya doğru sonlanmalıdır. Çünkü her kullanıcı bir alttakini locklamıştır.
Bir kullanıcının bir tablo üzerinde bir update işlemi yaptığını düşünürsek, sistemdeki o tabloyu kullanan bütün kullanıcılar, locklanmış olacak ve update işlemi yapan kullanıcı transaction işlemini sonlandırmadığı sürece lockdevam ediyo olacaktır. Aşağıdaki örnek resim bize bunu çok net anlatacaktır.
Yukarıdaki resimde transaction1 ilk updateini yapmış, transaction2 de bir update yapmış ancak transactionu sonlandırmadığı için transaction1 lock mekanizmasına takılmış ve transaction2 yaptığı bütün işlemleri sonlandırmadığı için mesai sonuna kadar transaction1 çalışamamış oldu.
Enterprise Manager üzerinden bu işlemleri takip edebilir. Lock sistemini devreye sokan kullanıcıyı kill (oturumunu kapatmak) yapabiliriz. Bunun için
Enterprise Manager anasayfasından performance tabına geçerek sayfanın sonunda blocking session sayfası açılır.
Yukarıdaki gibi bir blocking session sayfası açılacaktır. Görüldüğü gibi kimin lock başlattığını görebiliyoruz. İsterseklock mekanizmasını devreye sokan kullanıcıyı seçer ve yukarıdaki kill session butonunu tıklayarak locku kaldırırız.View session butonu ilede session ile ilgili bilgileri görebiliriz. Kullanıcnın sessionının kill edersek kullanıcı bi işlem yapmak istediğinde sessionın sonlandığına dair bir hata ile karşılaşacak ve DBA tarafından sessionın bitirildiğini anlayacaktır.
Blocking Session linkinin altında Hang Analysis sayfasında da lock’ları tree olarak görüntüleyebilirisiniz.
Kıll session işleminin SQL*PLUStaki ifadesi aşağıdaki gibidir.
Deadlocks:
Yukarıdaki resmi baz olarak deadlockı anlatalım. Transaction1 employee_idsi 1000 olan çalışanın maaşını %10 yükseltmek için bir update işlemi yapmak istemiş. Transaction2 employee_idsi 2000 olan çalışanın müdürünü 1342 numaralı müdüre çevirmek için update işlemi yapmış. Burada bir ıskıntı yok ancak transaction1 bu seferemployee_idsi 2000 lan çalışanın maaşına %10 zam yapmak için bir update işlemi yapmak için komut girmiş aynı zamanda transaction2 de employee_idsi 1000 olan çalışanın müdürünü 1342 numaralı müdüre çekmek istemiş. Ve çaprazlama olarak birbirlerini locka düşürmüşler. Bu çözülemez bir durmdur transactionlar sonlanamayacaktır. İşte tam bu noktada devreye deadlock girer ve lockı ilk başlatan kullanıcının örneğe göre transaction1intransactionunu sonlandıracaktır.
Tanımlayalım; iki kullanıcı birbirini çapraz şekilde locka düşürürse, iki taraf içinde transacitonlar lock kalacaktır. Bu durumda deadlock devreye girerek ilk lock başlatan kullanıcının transactionunu sonlandıracaktır.
Bu konuyu adım adım örneklendirelim. İki farklı kullanıcı ile iki farklı oturum açalım. Bu kullanıcılardan birisi SYS kullanıcısı diğeri ise HR kullanıcısı olsun. Ve yine örneklerimizde de yukarıdaki sorguları kullanacağız.
[oracle@ora -]$ . oraenv
ORACLE_SID = ? orcl
The oracle bas efor ORACLE_HOME=/u01……
[oracle@ora -]$ sqlplus /as sysdba
[oracle@ora -]$ . oraenv
ORACLE_SID = ? orcl
The oracle bas efor ORACLE_HOME=/u01……
[oracle@ora -]$ sqlplus hr/hr
SYS ve HR kullanıcıları ile iki farklı olturum açtık. Şimdi iki kullanıcımız ile aynı satır üzerinde bir update işlemi başlatalım. İlk olarak SYS kullanıcısı ile HR şemasındaki employees tablosundaki employee_id’si 100 olan kullanıcının maaşı ile ilgili değişiklik başlatalım sonrasında ise HR kullanıcısı ile aynı satıra başka bir işlem yapalım. Aşağıdaki gibi,
SYSDBA Update işlemi
HR Update işlemi
SQL> UPDATE hr.employees
   2     SET salary*salary+100
   3     WHERE employee_id=100;
SQL> UPDATE employees
   2     SET salary*salary*1.1
   3     WHERE employee_id=100;
SYSDBA kullanıcısı ile başlattığımız sorguyu rollback edene kadar ya da commit edene kadar HR kullanıcısı yaptığı update şilemi için lock olacak ve SYSDBA’in işlemini commit ya da rollback ile sonlandırmasını bekleyecektir. Sizinde gördüğünüz gibi HR kullanıcısı kilitlenmiş durumda.
Şimdi enterprise manager sayafasını açalım ve Blocking Session linkini açalım. Ve açılan sayfada lock’ları inceleyelim.

Hiç yorum yok:

Yorum Gönder