Bu site emekli olmuştur. Arşiv amaçlı olarak
BT AKADEMİ
sponsorluğunda yayın hayatına devam etmektedir.
Ana Sayfa
.net TV
Makaleler
Kaynak Kod
Haberler
Serbest Köşe
Canlı Köşe
Forum
C#nedir?
Ekibimiz
RSS
ADO.NET/SQL
YAZAR HAKKINDA
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ı
:
86252
Yorum Sayısı
:
2
yorum yaz
SİTE İÇİ ARAMA
Ü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.
C#nedir? hesabınız yok mu?
Üye olabilmek için
tıklayın
.
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.
Silindi
emre TAŞ
yazının devamı >
silindi
emre TAŞ
yazının devamı >
silindi
emre TAŞ
yazının devamı >
silindi
emre TAŞ
yazının devamı >
silindi
emre TAŞ
yazının devamı >
Bende Yazmak İstiyorum
Blogroll
Turhal Temizer
Conda install environment.yml Package
23.11.2024
Turhal Temizer
Mac OS/X Removing CUDA
23.11.2024
Burak Selim Şenyurt
Rust ile ECS Yaklaşımını Anlamak
23.11.2024
Burak Selim Şenyurt
Birlikte Rust Öğrenelim Serisi
23.11.2024
Diğer Herşey
»
Makaleler RSS
»
Video Gönder
»
Makale Gönder
»
Serbest Köşeye Yazı Gönder
»
Yazar Başvurusu
»
C#nedir? Ekibinde Olmalıyım!
Sponsorlar
Ana Sayfa
/
Makaleler
/
Mehmet Ali Ecer
/
ADO.NET/SQL
/
Ölümcül Kilitlenme(DEAD LOCK) Nedir ve Nasıl Önlenir?
Ölümcül Kilitlenme(DEAD LOCK) Nedir ve Nasıl Önlenir?
Favorilerime Ekle
Gönderiliyor lütfen bekleyin...
arkadaşıma gönder
Arkadaşınızın email adresi:
*
Mesajınız:
Ö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
SUAT YILDIRIM
/
üye hakkında
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
eralp erat
/
üye hakkında
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
Dizayn ve Kodlama
bt
akademi
. Tüm Hakları Saklıdır © Copyright 2002-2009 c#nedir?com
Makaleler
Serbest Köşe
Makale Gönder
.Net TV
Video Gönder
Canlı Köşe
Kaynak Kod
Forum
Haberler
Röportajlar
Anketler
C# Nedir?
İletişim
Site Haritası
RSS
Favorilere Ekle
Üyelik
Hesap Aktivasyon
Ekibimiz
Ekibe Katıl