Sql Server Nolock ile herhangi bir tabloda kayıt üzerinde yapılan işlem sonlanana kadar server sql server tarafından ‘Locking’ kilitlenir ve bu işlem sonlanana kadar başka bir kullanıcının bu tablo üzerinde işlem yapılması engellenir.
SQL Server Nolock Deyimi Nedir, Nasıl Kullanılır?
Sql server’da herhangi bir tabloda kayıt üzerinde yapılan işlem sonucunda işlem sonlanana kadar server sql server tarafından ‘Locking’ kilitlenir ve bu işlem sonlanana kadar başka bir kullanıcının bu tablo üzerinde işlem yapılması engellenir. Böylece aynı kayıt üzerinde kullanıcıların yaptığı işlemlerin çakışmaması için işlem sonucunda diğer kullanıcıya ‘Locking’ kilitlenen tablo açılarak kullanıcıya bir sonraki işlem için izin verilir. Küçük projelerde bu aralığı anlamanız imkansız ama aynı anda 1000’lerce işlem yapan projelerde bu farkı hissetmeniz mümkündür.
Bu durumu aşabilmek için ne yapmamız gerekiyor diye soru sorduğunuzu duyar gidibiyim 🙂
Bunun için SQL Sorgu cümleciğimizde WITH (NOLOCK) deyimini kullanabiliriz.
Örnek bir SQL cümlesi ile daha iyi anlayabilirsiniz.
1 | SELECT * FROM CUSTOMERS WITH(NOLOCK) |
Bu cümle ile artık cutomers tablosuna isterse milyonlarca aynı anda kayıt olsun erişme izni elde etmiş oldunuz yalnız bu işlemin size kullanım açısından avantajı olduğunu düşünsenizde kimi yerlerde dezavantaj oluşturabilmektedir. Örnek olarak bir tablo üzerinde son 1 adet kalan ürün için aynı anda 2 kişi birden işlem yapabilir ve tablo kilitli olmadığı içinde ürün aynı anda işlem yapan 2 kişiye birden hata vermeden aktarıldı. Biz örneği 2 kişiyle sınırlı tuttuk ama orta ölçekli veya büyük ölçekli projelerde aynı anda 1000’lerce vaya milyonlarca yapılacak işlemlerde ciddi karmaşalıklar çıkabilir. Bu karmaşıklığın önüne geçmek için ise ‘TRANSACTION’ kullanmanız gerekir.
📚 İlgilenebileceğiniz Farklı Sql Server Kaynakları
- SQL Server Üzerinden Windows Servisleri Yönetmek
- Sql Server da Unutulan “sa” Şifresini 3 Farklı Yöntem ile Değiştirme
✍ Lütfen olumlu-olumsuz tüm görüşlerinizi bana yorum yada mail yolu ile iletmeyi ihmal etmeyin.
🔗 Sosyal medya kanallarından makaleyi paylaşarak destek olursanız çok sevinirim.
👋 Bir sonraki makalede görüşmek dileğiyle.
Sql server nolock nedir?
Bu with (nolock) kullanımı için net bir cevap alabilmek adına bir örnekleme yapmak istiyorum. Tüm yazma silme update işlemlerinde Begin Transaction commit yada rollback yapılarak işlemlerin kayıt altına alındığını düşünürsek.
transaction başlatılıp
müsteri_id 15 olan bir kaydın musteri_borc alanına 100 olan değere 100 daha ekleyip update işlemi yapıyor commit işlemi yapılmadan aynı anda başka bir terminal müsteri tablosuna select * from müsteri with (nolock) diyerek sorgu çektiğinde sorgu sonucu musteri_borc alanını 100 olarak mı görür yoksa 200 olarak mı görür
Aynı şekilde transaction baslatıldı yeni bir müsteri kaydı 20 numaralı ID ile kayıt edildi. Commit işlemi gerçekleşmeden Bu arada yine aynı anda baska terminalde aynı tabloya select * from musteri with (nolock) denirse 20 numaralı kayıt sorguda gelir mi?
Yani tüm insert update delete işlemlerimizi trans commit rollback ile yapıyorsak deadlock engellemek için with (nolock) kullanmak uygun mu?
Saygılarımla,
Recep MUT
Yani işin özü transaction kullanmasak da aynı tabloda sadece tek bir işlem yetki sahibi olacak dediğinize göre… 2 process aynı tabloda birlikte yürüyemez eğer WITH(NOLOCK) ile bu müstesna bozulana kadar…
Evet doğrudur jmeter v.b tool’lar aracılığı ile stres testi yapıp çok fazla kaydın yer aldığı bir tabloya stres testinin yapılacağı sayfadan sogulama yapın with deyimi ile birde with deyimi olmadan stres testi yapıp doğru sonucu çok daha net şekilde görebileceksiniz.
Script olarak tablo oluştururken craate table falandafilan ( misalID uniqueidentifier not null default newid() primary key, ….. ) GO
dediğimde tablo sağ klik edit top 200 rows tıklandığında tabloya bilgi giriyorum (giremiyorum) bana null geçemezsin kardeşim diyor.
Sonra tabloya sağ tıklayıp design diyorum bir bakıyorum ki misalID ye default value or binding karşısı BOŞ !
Create script ile yazılan DEFAULT NEWID()’yi neden buraya uygulamamış ?
Alttaki gibi basit bir kullanımla ID ve Name alanlarını oluşturuyorum ve ID için newid() veriyorum design dediğimdede direk (newid()) olarak geliyor başka bir sıkıntı olabilir.
CREATE TABLE Test(
ID UNIQUEIDENTIFIER DEFAULT newid(),
NAME NVARCHAR(50) NOT NULL
)
UNIQUEIDENTIFIER den sonra NOT NULL tanımlamasını da yaptınız mı ?
PRIMARY KEY de demiştim. ve tabloda en az 2 default veri tanımlaması var default newid() ve default getdate()… acaba 2 adet default olması mı sebep … neyse…
ilginç geldi bana. tuhaf bir durum…
tabii aynı veri için değil default getdate olan girişTarihi default getdate () 😀
ilgilendiğiniz için çok teşekkür ederim. iyi pazarlar dilerim.
hürmetler…
Belittiğiniz gibi gerekli düzenlemeleri yaptım yinede bir sıkıntı göremedim. Tarihide GUID değeride default olarak atıyor.
DROP TABLE Test
GO
CREATE TABLE Test(
ID UNIQUEIDENTIFIER PRIMARY KEY NOT NULL DEFAULT newid(),
NAME NVARCHAR(50) NOT NULL,
Date DateTime DEFAULT GETDATE()
)
Şöyle bir soru sormuştum http://www.cozumpark.com/forums/thread/506226.aspx
lâkin şimdi iyice aklım karıştı çünkü WITH(NOLOCK) kullanırsak transactionlar “kesinkes gereki” gibi bir sonuç çıkıyor sanırım.
Eğer WITH(NOLOCK) kullanılmazsa transaciton olmasada işlem yapılan tablolar kilitleniyor mu yani ?
Tabii forumda daha detaylı okuyabilirsiniz ama bir kısmını paylaşayım;
“Rezerve edilecek ama şimdi 4 process de aynı anda erişebilir ve hepsi rezerve edilmemiş gibi görüp aynı anda işleme başlayabilir mi ?
Kontrol etti baktı ki rezerve edilmemiş. 4 ü e rezerve olmadığından işleme başladı ve şimdi tek tek ayırmaya çalışacaklar aynı saati… Tek bir process “dur ben daha işlem yapmadım, bitireyim” gibi bir bloke mi koyuyor ? Bu manuel mi yoksa otomatik mi ? Ya da manuel olarak biz kullanıcılar bunu belirtebiliyor muyuz ?”
gibi bir soru sormuştum ama; “sen zaten WITH(NOLOCK) kullanmıyorsun endişe etmene gerek yok” diyen olmadı açıkçası…