Basit bir seçme sorgusu kilitler alıyor mu?


14

SQL Server için çok yeniyim ve aşağıdaki çok basit selectifadenin herhangi bir kilit alıp almayacağını anlamak istiyorum .

Select * from Student;

Lütfen ifadenin bir begin tranblok içinde çalışmadığı durumu göz önünde bulundurun .


1
Bu düşündüğünüzden çok daha karmaşık bir soru. Cevap birçok şeye bağlıdır (oturum işlem yalıtım düzeyi nedir? Okunan anlık görüntü yalıtımı açık mı? Taranan dizinde satır veya sayfa kilitlerini önlemek için ayarlanmış seçenekler var mı?) Ve çalışan ifade sırasında bile değişebilir (kaç satırlar tabloda mı? tablo bölümlenmiş mi?). İşte okumaya başlamak için iyi bir nokta.
Jon Seigel

Yanıtlar:


5

Evet, varsayılan olarak okuduğu satırlarda paylaşılan bir kilit alır (ayrıca, okuyacağı kümelenmiş dizinin tüm sayfalarında bir Amaç Paylaşımlı kilit alır), bu kirli okumaları önlemek için yapılır. Ancak bunu atlamanın yolları vardır (SQL Server'da nolock ipucu vardır). İfade bir BEGIN TRAN'da değilse, SELECT ifadesi çalıştıktan sonra kilit serbest bırakılır.

Daha fazla bilgi burada bulunabilir:

http://msdn.microsoft.com/en-us/library/ms184286(v=sql.105).aspx http://www.sqlteam.com/article/introduction-to-locking-in-sql-server


Buna ek olarak, işlem yalıtım düzeyini taahhüt edilmeden okuyacak şekilde de ayarlayabilirsiniz.
Zane

1
SELECT on satırı okursa, on satır da on satırın tamamı okunana kadar tutulur mu veya her satırda edinilip serbest bırakılır mı?
Ian Warburton

26

Aşağıdaki, çok basit select deyiminin herhangi bir kilit alıp almayacağını anlamak istiyorum

Bu bir olan yaygın bir yanlış kanı bir o SELECTvarsayılan çalışan sorgu READ COMMITTEDhareket yalıtım düzeyi olacak hep kirli okur önlemek için kilitleri paylaşılan take.

SQL Server, bunlar olmadan taranmamış verileri okuma tehlikesi olmadığında paylaşılan satır düzeyinde kilitler almaktan kaçınabilir (ancak daha yüksek düzey Niyet Paylaşımlı (IS) kilitler alınmasına rağmen).

Paylaşılan satır kilitleri bile vardır alındıklarında çok önce serbest bırakılabilir (eşzamanlı başka işlem sayfayı değiştirdi belki de satır üzerindedir) SELECTdeyimi tamamlar.

Çoğu durumda, sunucu bir sonraki satırı işlemeden hemen önce satırın kilidi 'açılır'. Varsayılan yalıtım düzeyinde alınan paylaşılan kilitlerin, işlemin sonuna kadar değil, geçerli ifadenin sonuna kadar tutulduğu durumlar vardır .

Mevcut izolasyon düzeyini NOLOCKtablo ipucu ile geçersiz kılmak neredeyse her zaman kötü bir fikirdir .

Kilitleme bir uygulama detayıdır. SQL Server , geçerli yalıtım düzeyi tarafından sağlanan anlamsal garantileri karşıladığından emin olmak için gerektiğinde kilitler alır . Kilitlerin neden alındığına dair biraz bilgi sahibi olmanın kesinlikle yararlı olduğu zamanlar vardır, ancak bunları tahmin etmeye çalışmak çoğu zaman karşı üretkendir.

SQL Server çok çeşitli yalıtım seviyeleri sağlar; veri tüketicilerinizin ihtiyaç duyduğu garantileri ve davranışları sağlayanı seçin.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.