SQL Server Nolock Deyimi

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