SQL Server Nolock Deyimi

Sql server’da herhangi bir tabloda kayıt üzerinde yapılan işlem sonucunda işlem sonlana kadar server sql server tarafından ‘Locking’ kilitlenir ve bu işlem sonlana kadar başka bir kullanıcının bu tablo üzerinde işlem yapılması engellenir.

Sql server’da herhangi bir tabloda kayıt üzerinde yapılan işlem sonucunda işlem sonlana kadar server sql server tarafından ‘Locking’ kilitlenir ve bu işlem sonlana 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.

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.

SQL Server Nolock Deyimi
4.5 (90%) 10 oy

Bunlar da hoşunuza gidebilir...

10 Cevaplar

  1. ali guner dedi ki:

    Şö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ı…

  2. ali guner dedi ki:

    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…

    • Murat ÖNER dedi ki:

      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.

      • ali guner dedi ki:

        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ış ?

        • Murat ÖNER dedi ki:

          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
          )

          • ali güner dedi ki:

            UNIQUEIDENTIFIER den sonra NOT NULL tanımlamasını da yaptınız mı ?

            • aligüner dedi ki:

              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…

              • aligüner dedi ki:

                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…

              • Murat ÖNER dedi ki:

                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()
                )

  3. Recep MUT dedi ki:

    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

Bir Cevap Yazın