SQL Server’da DeadLock Nedir?

19 Eki by NURULLAH ÇAKIR

SQL Server’da DeadLock Nedir?

DeadLock nedir? Film yıldızı ismi gibi dursada uygulamalarda ciddi anlamda sıkıntıya sebep olmaktadır. DeadLock’ı kısaca özetlemek istersek iki veya daha fazla transaction’ın birbirini kilitlemesi ve ikisinin de birbirini beklemeye başlamasıdır. SQL Server bu durumun sona ermeyeceğini anlar ve transaction’lardan bir tanesini kill edip rollback yapar. DeadLock örneği için verilen en klasik örnek şudur: İki öğrenci kantine gitti. Öğrencilerden bir tanesi bir çikolataya elini uzattı ve tuttu. Tam o sırada diğer öğrencide çikolatayı tuttu ve kilitlenme oluştu. Kantinci amca sorunu çözmek için son gelen öğrencinin isteğini iptal etti ve parasını geri verdi. İlk gelen öğrenci ise çikolatayı aldı ve gitti.

 

Deadlock’ı anlamak için SQL Server’ın transaction yapısını bilmek gerekir.

 

Normalde SQL Server’da otomatik commit işlemi vardır. Yani transaction’ın başına BEGIN TRANSACTION ve sonuna da COMMIT koymasanız bile sql server arka planda otomatik olarak bu ifadeler varmış gibi davranır. Fakat siz manual olarak transaction’ın başına BEGIN TRANSACTION ifadesini koyarsanız SQL Server COMMIT ifadesini görene kadar işlemi tamamlamaz.

 

Örnek üzerinden gitmek gerekirse.

 

A procedure’ünün içinde aşağıdaki gibi bir kod bloğu olsun:

 

BEGIN TRANSACTION

Update tableA…

.

.

.

Update tableB

COMMIT

 

B procedure’ünün içinde de aşağıdaki gibi bir kod bloğu olsun:

 

BEGIN TRANSACTION

Update tableB

.

.

.

Update tableA

COMMIT

 

A procedure’ü işleme başladı tableA’yı update etti. Ama transaction’ın başında BEGIN TRANSACTION olduğu için be tableA’yı update eder etmez COMMIT ifadesini çalıştırmadığı için tableA’ya koyduğu lock henüz release olmadı. Yani hala tableA üzerinde A procedure’ünün lock’ı var.

 

B procedure’ü de hemen işleme başladı ve tableB’yi update etti. Ama transaction’ın başında BEGIN TRANSACTION olduğu için be tableB’yi update eder etmez COMMIT ifadesini çalıştırmadığı için tableB’ye koyduğu lock henüz release olmadı. Yani hala tableB üzerinde B procedure’ünün lock’ı var.

 

A procedure’ü COMMIT etmeden işlemlerine devam etti ve daha sonra yukardaki kod bloğunda göründüğü gibi tableB’yi update etmeye çalıştı. Fakat tableB üzerinde B procedure’ünün lock’ı olduğunu görüp B procedure’ünü beklemeye başladı.

 

B procedure’ü de COMMIT etmeden işlemlerine devam etti ve daha sonra yukardaki kod bloğunda göründüğü gibi tableA’yı update etmeye çalıştı. Fakat tableA üzerinde A procedure’ünün lock’ı olduğunu görüğ A procedure’ünü beklemeye başladı.

 

Anlayacağınız üzere bu yukardaki iki transactiondan bir tanesi SQL Server tarafından otomatik olarak kill edilmezse ikisi de sonsuza kadar birbirini bekleyecek. Biraz aşk hikayesi gibi oldu ama SQL Server birbirlerini sonsuza kadar beklemelerine razı olmayıp birini seçip öldürüyor ve diğeri hayatına devam ediyor.

Loading

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir