7 Eylül 2016 Çarşamba

Lock, Blocking, Deadlock Nedir?

Veri tabanları ACID(https://en.wikipedia.org/wiki/ACID) olmalıdır. Bu özellikleri sağlayabilmek için kullanılan mekanizmalardan bir tanesi de LOCK mekanizmasıdır. Birbirininden farklı lock tiplerini bulunur; okuma, yazma gibi. Lock tiplerini birbiri ile uyumlu ve ya uyumsuzdur. Örneğin okuma birbirlerini ile uyumlu iken yazma uyumsuz olabilir. Daha açık olması için, bir kaydı aynı anda iki proses okuyabilirken, aynı anda iki proses güncelleyemez. Buradan anlaşılabileceği gibi okuma işlemlerini yani select cümlelerini de sisteme lock koyar.

Lock konusunda diğer bir husus ise, lock seviyesidir. Seviyeden kasıtı, row, page veya tablo diye özetleyebiliriz. Örnek verelim, insert işlemi sadece o kayıtı locklar, bu sırada aynı kayıta okuma gelirse lock olduğundan dolayı insert işlemi tamamlanana kadar bekler. Yine tek bir kayıtı güncellediğinizi(update) düşünelim. Bu durumda sadece o kayıt mı locklanır? Bilemeyiz, eğer güncelleme işlemi index kullanmıyorsa tüm tabloyu bile locklamış olabilir. Buradan açıkca anlaşılacağı gibi, o tablodan okuma, yazma yapacak olan tüm prosesler güncelleme işleminin bitmesini bekleyecektir.

Lock işlemini anlatırken, bekleme konusu geçti. Veritabanında Wait dediğimiz beklemeler oluşur. Bekleme sebepleri farklı farklıdır, lock sadece bunlardan bir tanesinidir. Memory, CPU,disk hatta network gibi kaynaklar kullanımlarında dolayı beklemeler oluşabilir. Örneğin 20 core bir makinede aynı anda 20 den fazla proses işlem yapmak isterse ne olur? Yine okuma hızı düşük bir disk sisteminden büyük miktarda veri okursanız ne olur? Veri tabanı sistemi, okuma işlemi bitene kadar bekleyecektir. Bu tip beklemelere IO_wait denir.
Lock ve wait konularını açıkladıktan sonra blocking’i açıklayabiliriz. Her hangi bir sebepten
ötürü, bir proses başka bir prosesi bekliyorsa, bu işleme blocking denir. Aslında sistemde lock var yanlış bir terimdir. Sistemde her zaman lock olur, tehlikeli olan lock’ın blocking’e sebep olmasıdır.


Deadlock ise, karşılıklı iki prosesin birbirini beklemesidir. Basitce örnekleştirelim, 2 kayıtlı
tabloda ilk proses 1 nolu kayıtı güncellemiş 2. kayıtı güncelleyecek, diğer proses ise 2 nolu kayıtı güncellemiş 1 nolu kayıtı güncelleyecek. Bu durumda iki proses birbirini sonsuza kadar beklemesi gerekir. Bu durum oluştuğunda veri tabanı sistemi fark eder ve içlerinden birini kurban olarak seçip sonlandırır


Özetle blocking ve deadlock’ın sebebi lock’lardır.
CPU, memory vs gibi hususlardan kaynaklanan wait ve blocking’lere developerların müdahale sanşı yoktur. Developerlardan beklenen; locking süresini münkün olduğunca minimumda tutmaktır. Bu da kapsamı münkün olduğunca dar tutmak yani transaction bloğunu küçültmek ve doğru index kullanarak değdiğimiz(lock koyduğumuz) kayıtların sayısını minimumda tutmakla olur.





Hiç yorum yok:

Yorum Gönder