SQL (nolock)

SQL bazı drumlarda verileri kilitler. Örneğin bir tabloya update çekiyorsunuz ya da bir transaction başlattınız. Ama transaction henüz sonlanmadı. Bu tür durumlarda SQL dataya diğer connection’lardan erişimi durdurur.

Şimdi sizinle şöyle bir deney yapalım ;

SQL Server Management Studio’yu açalım ve “New Query” butonuna 2 defa tıklayarak 2 adet boş query penceresi açalım

nolock1

Management studio da 2 adet query penceresi demek, aslında sql server a oluşturulmuş 2 farklı bağlantı demektir. SQLQuery1.sql penceresinde yukarıda görüldüğü gibi  “Begin Tran” ve alt satıra bütün bir tabloyu UPDATE eden bir script yazın. Şimdi query i çalıştırın. Update ettiğiniz tabloya select çektiğinizde update ettiğiniz bütün alanların değiştiğini görüceksiniz. Aslında daha değişmedi siz “Begin Tran” ile başlattığınız transaction ı commit edene kadar hiçbir değişiklik veritabanına kaydedilmez ve siz commit verene kadar, yani “Commit Tran” yazana kadar SQL server tablodaki kayıtları kilitler. Kimse bu tablodan select ile bu verileri görüntüleyemez. Sizin çektiğiniz Select çalıştı ama değil mi. Bunun nedeni sizin Transaction ı başlattığınız aynı connection ile select çekiyor olmanız. Aynı Query Penceresinde olmak burada aynı connection da olmak demektir.

nolock2

Şimdi aynı select i açtığımız diğer Query Penceresinden yani SQLQuery2.sql den deneyelim

Select imizi SQLQuery2.sql penceresinde çektiğimizde, alt tarafta görüğümüz executing query yazısının sürekli orda olduğunu görürsünüz. Diğer connectiondan açtığınız transaction henüz tamamlanmadığı için verileriniz hala kilitli ve  onlara, şu anda başka bir connection da olduğunuz için ulaşamıyorsunuz. Bu select cümleciğinin size istediğiniz listeyi getirebilmesi için SQLQuery1.sql penceresinde, ilk resimde — işareti ile commitlenen”rollback tran” cümleciğini — işareti olmadan, yani commitsiz yazmalı ve çalıştırmalısınız. Tabi eğer yaptığınız Update e onay vermek istiyorsanız; “commit tran” cümleciğini de kullanabilirsiniz.

İşte böyle durumlarda çektiğiniz bir sorgunun bir nesnenin kilitli olmasına bakmadan size listesini getirmesini istiyorsanız yukarıdaki select cümleciğini şu şekilde yazmalısınız;

Select * from [AdventureWorks2008R2].[HumanResources].[Employee] (nolock)

Bu durumda sql ulaşmak istediğiniz verinin kilitli olup olmadığına bakmadan listeyi size vericektir. (Nolock) olayı bir çok durumda yapmış olduğunuz sorguların kilitleri beklemesini engelleyeceğinden programlarınızın daha hızlı çalışması için tercih edeceğiniz bir yöntemdir. Fakat yine de verilerin ne zaman nolock ile çekileceğine karar vermek dikkatli düşünülmesi gereken bir iştir. Çünkü verileriniz biryerlerde işleniyor ve süreç henüz sona ermedi. Siz sürecin sona ermesini beklemek istiyor musunuz? Yoksa bu durum sizin mevcut şartlarınızda önemsiz mi? Karar verilmesi gereken asıl nokta budur.

 

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir