27 Eylül 2016 Salı

"NOLOCK or READUNCOMMITTED in UPDATE or DELETE"

Merhaba,

Dünkü çalışmada bir blog konusu daha vardı, şimdi fırsatım varken o konuda da yazmak istedim.

Diğer test edip emin olmak istediğimiz konu da hangi versiyonda hatırlamıyorum, ama halihazırda SQL Server'ın "Deprecated" özellikler listesine giren, UPDATE ve DELETE komutlarıyla "NOLOCK" Hint'inin kullanımı konusuydu. Dünkü yaptığımız çalışmada, çalıştığımız sunucuda "NOLOCK or READUNCOMMITTED in UPDATE or DELETE" uyarılarının olduğunu gördük. İlgili arkadaşlar bunun olamayacağını, böyle bir kullanım pratiğinin kurumda uygulanmadığını, başka bir kullanım şeklinin bu sayacı arttırmış olabileceğini düşünüyorlardı. O zaman test edelim ve görelim dedik, böylece yeni bir blog konusu çıktı ortaya.

Öncelikle "Deprecated" olmuş bir özellik ne demek çok özetle buna değineyim. Bir özellik SQL Server'ın yeni versiyonlarından kaldırılmadan birkaç versiyon önce "Deprecated" özellikler listesine girer. Özellik yeni versiyonda kaldırılmışsa da "Discontinued" özellikler listesine girer artık. SQL Server'ın yeni versiyonlarıyla güncellenir bu listeler. Bu nedenle veritabanı uygulaması geliştirirken, eğer birkaç yıl içerisinde uygulamanızda ilginç ilginç hatalar görmek istemiyorsanız bu listelerdeki değişiklikleri de takip etmenizde fayda var.

Efendim bu kontrolü aşağıdaki sorgu ile yapabilirsiniz:

SELECT * FROM sys.dm_os_performance_counters
WHERE [object_name] = 'SQLServer:Deprecated Features' and [instance_name] = 'NOLOCK or READUNCOMMITTED in UPDATE or DELETE' AND [cntr_value] > 0

Aşağıdaki gibi bir komutu her çalıştırdığınızda, bu sayacın değeri bir bir artacaktır:

Not: Önce X isimli ve içerisinde metin veritipiyle "name" alanı olan ve içinde de en azından "Ekrem" kaydı bulunan bir tablo oluşturmalısınız.

Örnek1:
UPDATE alias_name SET name = 'Ekrem' FROM x AS alias_name WITH (NOLOCK);

Not: Eğer sürekli aynı değerle güncellerseniz sayaç artmıyor. Sadece değer değiştiğinde artıyor. Yani ilk testinizde değeri "Ekrem" olarak belirttikten sonra, mesela "Ekrem1" yapın, sayaç öyle artıyor.

Eğer aşağıdaki gibi bir komut çalıştırırsanız bu sayacın değeri artmıyor:

Örnek2:
UPDATE alias_name SET name = 'Ekrem' FROM (SELECT * FROM X WITH (NOLOCK)) AS alias_name;

Bu nedenle sanılanın aksine, ilgili ortamdaki uygulamada ilk örnekteki gibi bir kullanım olduğunu sanıyorum. Belli ki gerçekten NOLOCK Hint'ini doğrudan UPDATE komutuyla kullandığımızda artıyor bu değer. Tabii ki daha da emin olmak için ikinci örnekteki kod farklı şekillerde değiştirilerek de uygulanabilir. Fakat benim ilk etapta aklıma gelen bu örneklerle sonuç böyle.

Sevgiler,
Ekrem Önsoy

Hiç yorum yok: