Bu site emekli olmuştur. Arşiv amaçlı olarak BT AKADEMİ sponsorluğunda yayın hayatına devam etmektedir.




C#nedir?com
 
YAZAR HAKKINDA
Mehmet Ali Ecer
Mehmet Ali Ecer
http://www.csharpnedir.com/
İletişme geçmek için tıklayın.
2 Makalesi yayınlanmakta.
Yazar hakkında detaylı bilgi için tıklayın.
Yayınlanan diğer makaleleri için tıklayın.
İlgili etiketler: commit durumda ilgili islemler islemlerini kilitlenme proses prosesde prosesi prosesin server sistem verileri yapilan yapmak ADO.NET/SQL Mehmet Ali Ecer
 
YAZI HAKKINDA
Türü : Makale
Serbest Köşede C#nedir?com üyelerinin hazırladıkları yazılar yayınlanır. Bu yazılar editör incelemesine girmeden yayınlanır.
Seviyesi : Orta
Kategori : ADO.NET/SQL
Yayınlanma Tarihi : 18.5.2007
Okunma Sayısı : 86433
Yorum Sayısı : 2     yorum yaz
Site İçi AramaSİTE İÇİ ARAMA
Üye Girişini AçÜye GİRİŞİ
Üye girişi için tıklayın.
Kullanıcı Adı
Şifre
 
Beni her zaman hatırla
Bir hafta boyunca kullanıcı bilgilerinizi kullanıcı çıkışı yapana kadar hatırlar. (Paylaşılan bilgisayarlarda önerilmez.)
 
Şifremi / Kullanıcı Adımı unuttum.
 
.net TV RSS Serbest KÖŞE (?)
Serbest Köşede C#nedir?com üyelerinin hazırladıkları yazılar yayınlanır. Bu yazılar editör incelemesine girmeden yayınlanır.
emre TAŞ
Silindi
emre TAŞ
yazının devamı >
emre TAŞ
silindi
emre TAŞ
yazının devamı >
emre TAŞ
silindi
emre TAŞ
yazının devamı >
emre TAŞ
silindi
emre TAŞ
yazının devamı >
emre TAŞ
silindi
emre TAŞ
yazının devamı >
Makale Gönder Bende Yazmak İstiyorum
.net TV RSSBlogroll
Turhal Temizer
Conda install environment.yml Package 8.12.2024
Turhal Temizer
Mac OS/X Removing CUDA 8.12.2024
Burak Selim Şenyurt
Rust ile ECS Yaklaşımını Anlamak 8.12.2024
Burak Selim Şenyurt
Birlikte Rust Öğrenelim Serisi 8.12.2024
  Diğer Herşey
Sponsorlar
BT Akademi
Medya Portakal
Video Hosting Sponsoru
Csharpnedir.com bir Ineta üyesidir
Uzman Abi
Her Yönüyle C# - Sefer Algan
Ölümcül Kilitlenme(DEAD LOCK) Nedir ve Nasıl Önlenir?
 
Kapat
Sayfayı Yazdır Sık Kullanılanlara Ekle Arkadaşıma Gönder MySpace Del.Ico.Us Digg Facebook Google Mixx Reddit StumbleUpon
Ölümcül kilitlenme iki veya daha fazla prosesin karşılıklı olarak birbirlerinin kilitlediği kaynaklara erişmek istemesidir. Özellikle büyük çaplı projelerde çokca karşılaşılır. Her iki prosesde sürekli birbirlerini beklediği için sistem kaynakları olumsuz yönde etkilenir. Özellikle server ın CPU değeri boşuna harcanmış olur. Bu da serverımızın performansını çok kötü etkiler hatta müdahale edilmeyen ölümcül kilitlenmelerde server cevap veremez duruma bile gelebilir. Örnek bir senaryo üzerinde ölümcül kilitlenmenin nasıl gerçekleştiğini anlatalım.





Elimizde iki tane prosedürümüz var bir kullanıcı A prosedürünü çalıştırıyor diğer bir kullanıcı ise B prosedürünü çalıştırıyor. Bu iki prosedürde içerisinde birden fazla işlem update barındıran prosedürlerdir. Böyle bir durumda bu iki prosedür tüm işlemlerini yaptıktan sonra verileri veritabanına yazar. Bu prosedürler kendi içerisinde TRANSACTION gibi çalışır. Öncelikle iki prosedür ilk işlemlerini yapıyorlar.

Yani A prosedürü X tablosunun ilgili satırını güncelliyor, B tablosuda Y tablosunun ilgili satırını güncelliyor. Güncelleme yapılırken proses bitene kadar COMMIT yani tüm işlemler tamam artık bunu veritabanına yazabilirsin denilene kadar(bu iki prosedürde tüm güncellemelerini yaptıktan sonra COMMIT işlemini yapar) yapılan tüm işlemlerden sonra işlem yapılan kayıtlara kilit koyar ve başka bir prosesin bu kayıtlara erişmesini engeller. Neden olarak ise bir tabloda yaptığımız bir işlem başka prosesleri de etkileyecektir bu durumda başka prosesler o işlemden önceki verileri mi yoksa o işlem yapılırken ki verileri alacağına karar veremez. Belki prosedür içerisinde herhangi bir nedenden dolayı işlem yapılan tablodaki veriler ROLLBACK yani geri alma işlemi yapacaktır.

Şimdiki durumda A prosedürü Y tablosunda işlem yapmak için B prosedürünün kilit koyduğu kilitin kalkmasını beklemektedir yine aynı durumda B proseside X tablosunda işlem yapmak için A prosesinin X tablosuna koyduğu kiliti kaldırmasını beklemektedir. Burada bir döngü oluşmakta ve her iki prosesde birbirini beklemektedir. Bu iki prosesde serverda asılı kalmaktadır.






Peki bu ölümcül kilitlenme nasıl önlenir?



Öncelikle çözüm için A prosedüründe ve B prosedüründe ilk güncelleme işlemlerinden sonra Commit konulup kullanılan tablolardaki kiliti çözmek gelebilir. Fakat Commit koymak hatalı bir çözümdür. Çünkü proses bitene kadar proses içerisinde bir hata ya da istenmeyen bir durum oluştuğunda rollback(geri alma) yapıldığında ancak commit olan yere kadar olan bölümü kurtarabilirsiniz. Commit yukarısındaki bölümü kurtarmak için ayrı bir çalışma yapmak gerekmektedir. Commit in bir diğer sakıncası ise her commit işleminden sonra veritabanında rollback segmentleri oluşur yani iki commit arasında yapılan işlemler server tarafından tutulur. Çok fazla commit yapılması hem prosedürün hızını yavaşlatır hemde serverın gereğinden fazla şişmesini sağlar.

Çözüm için bir diğer yöntem ise sql server üzerinde ölümcül kilitlenme(dead lock) olan prosesleri manuel olaraka tespit edip kapatmak ile olabilir. Burada özellikle sql admine çok fazla iş düşer. Sp_who prosesini çalıştırarak ölümcül kilitlenen olan tablolar görülebilir. Management Studio/ management/ ActivityMonitor kullanılarak halen aktif olan kilitlinmeler görülüp proseslerin üzerinde kill yapılarak ölümcül kilitlenmeler çözülebilir.

Diğer bir yöntem ise sql server ın ölümcül kilitlenmeyi farketmesi halinde daha az önceliği olan prosesi kill ederek diğer bekleyen prosese yol açması şeklindedir. Sql serverın hangi prosesin öncelikli olduğunu bilmesi için DEADLOCK_PRIORITY parametresinin LOW ya da NORMAL olarak eşitlemek gerekmektedir. Bu yöntemde her zaman dead lock ın yakalanabileceği garanti değildir. Yakalansa bile bu yakalamaya kadar geçen süre çok uzun olduğu için sistem kaynakları olumsuz yönde etkilenecektir.

Tam olarak bir çözüm yöntemi olmasada en çok kullanılan ve tercih edilen yöntem ise proseslerin başlarında kullanılacak olan tabloların ilgili satırlarını bir grup biçiminde kendisi ile update edilerek lock edilmesi ve daha sonra bu tablolar üzerinde işlemlerin yapılmasıdır. Yani A prosesi düşünülünce X ve Y arasında yapılan işlemler ve bu işlemlerin gerçeklenme süreleri yok edilerek deadlock a girme olasılığının bitirilmesidir. A prosesi ilk başlandığında X ve Y tablolarının ilgili kayıtları kendileri ile güncellenerek lock koyulur aynı işlem B prosesi için de yapılır A ve B den hangisi daha önce bu ilk adımı geçerse diğer proses geçenin işlemlerini yapmasını bekleyecektir. Şekille göstermek gerekirse;





Deadlock’a düşmemek için yapılabilecek diğer işlemler ise,

  • Mümkün olduğunda az sayıda tablo üzerinde işlem yapacak prosedürler yazmak. Gereksiz işlemler ile prosedürü yormamak.
  • Prosedürlerin çok hızlı çalışmalarını sağlamak.
  • Proses içerisinde yapılacak işlemleri mümkünse aynı tablo sırasında yapmak (Mesala, bizim örneğimiz için her iki prosesinde önce X i sonra Y yi güncellemesi.)
  • WITH(NOLOCK) kullanılarak yapılan seçim işlemlerinde eğer o satır üzerinde LOCK
    varsa Lock eden prosedür işlemini tamamlamadan önceki veri alınır ve sorgu lock ı beklemek zorunda kalmaz. Fakat alınan veri her an değişecek olması göz önüne alınmalıdır. Kullanılışı: (SELECT * FROM TABLO_ISMI WITH(NOLOCK)) şeklindedir.
Makale:
Ölümcül Kilitlenme(DEAD LOCK) Nedir ve Nasıl Önlenir? ADO.NET ve SQL Mehmet Ali Ecer
  • Yazılan Yorumlar
  • Yorum Yaz
EYL
5
2008
Makale çok güzel yazılmış. Kilitlenmeye yol açılacak yönteme küçük bir örnek verilip nasıl aşılacağı konusunu ve yöntemleri konusunda açıklamalar eklenirse süper olur ? teşekkürler
MAY
18
2007
Mehmet ellerine sağlık.Eklemek istediğim bir nokta var ,ekstra örnek(ler) koyabilirsen çok daha açık ve anlaşılabilir olacaktır. Başarılar.
Sayfalar : 1 
Yorum yazabilmek için üye girişi yapmalısınız. Üye girişi için tıklayın.
Üye değilseniz Üyel Ol linkine tıklayarak üyeliğinizi hemen başlatabilirisniz.
 
  • Bu Konuda Son 10
  • Eklenen Son 10
  • Bu Konuda Geçmiş 10
Bu Konuda Yazılmış Yazılmış 10 Makale Yükleniyor
Son Eklenen 10 Makale Yükleniyor
Bu Konuda Yazılmış Geçmiş Makaleler Yükleniyor